Aus Datei lesen



  • Zermyy schrieb:

    lSize=659706
    i=67698

    sieht doch gut aus.

    Zermyy schrieb:

    Zeile 78-84 will ich die Datei mit einem anderen Namen speichern.

    Dazu habe ich schon etwas geschrieben.

    Zermyy schrieb:

    muss ich nicht das -1024 einfach rückgänig machen in dem ich dann wieder +1024 rechne?

    hört sich gut an.

    Zermyy schrieb:

    das soll mir die Pixel filtern, die die nicht in das Bild rein sollen.

    Wutz wollte wissen warum da die ' stehen. Weißt du was die bedeuten?



  • Hey,

    Also der Unterschied ist mir Grade nicht klar! Ich gucke aber morgen nochmal und danke euch für die hilfe und das aufmerksam machen für die Fehler! Die Datei kann ich also nicht einlesen da schon eof erreicht ist !? Ich guck mir die Schleife nochmal an und wuerde mich über eure Hilfe freuen!

    Danke nochmal und frohe Ostern

    Lg zermy



  • Germany schrieb:

    Die Datei kann ich also nicht einlesen da schon eof erreicht ist !?

    Nochmal: Du hast die Datei schon eingelesen.
    Was meinst du, was das fread macht?



  • Entschuldigt die Autokorrektur macht aus Zermy Germany...

    Ja mit fread hab ich die Bilddatei in den Speicher gelesen bis zum Ende.
    Somit muss ich diese doch vom Ende an wieder zurück lesen können wenn alles soweit geändert ist oder ich setze den Zeiger an den Anfang und speichere diese so.

    In meiner Abfrage bin ich ja die ganze Zeit am Ende der Datei 🙂

    Die '' machen doch ein ASCI Zeichen daraus, wenn ich das richtig probiert habe.

    ich setzt mich morgen nochmal dran und versuche diese Schritte dann in Code zu bringen und poste den dann hier!

    Ich wünsche schonmal ein schönen Sonntag 🙂

    lg Zermy

    Ich brauche noch viel mehr gute Bücher für C! 😡 😃



  • Zermyy schrieb:

    Ich brauche noch viel mehr gute Bücher für C! 😡 😃

    Es gibt nicht viele gute Bücher zu C.

    if( pixel<'-900'|| pixel>'250')
     {
         pixel=-1024;
    
     }
    

    muss natürlich heißen:

    if( pixel<-900|| pixel>250 )
     {
         pixel=-1024;
    
     }
    

    schließlich rechnest du selbst auch nicht mit ASCII Zeichen

    pixel='-1024';
    


  • ja xD danke^^

    Erst nochmal frohe Ostern.

    Ich setzt mich nun mal ran und bring das alles in C-Code!

    Habt ihr evtl. gute Vorschläge für GUTE Bücher?

    C von A bis Z ist ganz nett hat aber nur die einfachen Beispiele, werde das aber trotzdem weiter lesen.

    lg Zermy



  • Hey,

    ich hab einmal meine Deklaration gepostet und den wichtigen Teil.
    Das Gegenteil von fread ist natürlich fwrite xD.

    int main () {
      FILE * pFile;
      long lSize,x;
      char * buffer;
      size_t result;
      int n=0,y,z,v=0,i;
      short c;
      short suchwerte[2] = {0x7FE0,0x0010};
      short *bild;
      FILE *output;
      int *b;
          int ch;
    
     bild = (short *)buffer; 
      for(i=0; i < (lSize / sizeof(short)-1); i++)
      if ((bild[i] == suchwerte[0]) && (bild[i+1] == suchwerte[1])  ) break;
    
      i+=(4/sizeof(short));
    
      printf("%d\n",i);
      printf("%d",lSize);
    
    for(x=0;x<512*512;x++)// Hier rennt x durch das bild als zähl variable
    {
    	short pixel;
    
    	pixel = bild[x] - 1024; 
    
    	if( pixel<-900|| pixel>250)// dann wird hier geguckt ob  das Pixel raus muss, wenn ja wird in bild das Pixel gespeichert undzwar so das die informationen stimmen also +1024 da ich vorher ja -1024 gerechnet hab xD
     {
    
    	 bild[x] = pixel+1024;// pixel ist dann 0
     }
    
    	bild[x] = pixel+1024;// wenn das nicht in die if anweisung geht dann wird das pixel einfach so gespeichert ohne veränderung
    
    } 
    
    fwrite (buffer , 1 , sizeof(buffer) , output);
    
    //bei fwirte ist mir noch nicht ganz klar was die 1 bedeutet size_t size soll da rein, size_t ist soweit ich das verstanden habe doch eine funktion die mir die größe anzeigt. aber die größe ist doch schort oder irre ich mich da
    

    Das Bild ist nun auch wieder größer, nur öffnen kann ichs nicht xD
    Es kommt aber kein Fehler mehr.

    lg Zermy



  • Zermy schrieb:

    Habt ihr evtl. gute Vorschläge für GUTE Bücher?

    http://www.c-plusplus.net/forum/p2195649#2195649

    Zermy schrieb:

    C von A bis Z ist ganz nett hat aber nur die einfachen Beispiele, werde das aber trotzdem weiter lesen.

    Damit schadest du dir, weil vieles/die überwiegende Mehrzahl der 'Erklärungen' und der Beispielcodes falsch sind. Du wirst mit dem dort vermitteltem Pfusch-Wissen später viel Ärger haben und mühsam vieles nochmal neu (richtig) lernen müssen.
    http://www.c-plusplus.net/forum/272350-full



  • Zermy schrieb:

    bild[x] = pixel+1024;// pixel ist dann 0
    

    Nein. Überleg mal was rauskommt, wenn pixel z.B 1000 ist

    Zermy schrieb:

    fwrite (buffer , 1 , sizeof(buffer) , output);
    

    Sind die gleichen Parameter wie bei fread.
    sizeof(buffer) gibt die die Größe der Zeigervariablen an ist z.Zt. meist 4 oder 8.

    Die 1 gibt die Elemntgröße an.
    Wenn du z.B 500 int lesen willst schreibst du

    fread(buffer,sizeof(int),500,file);
    

    Aber: DU kennst deine Filegröße in Byte bereits.



  • Hey,

    stimmt das war ne gute Erklärung.Danke!

    Das mit dem pixel hab ich nicht richtig überlegt.
    pixel = bild[i] + 1024; müsste das dann einfach sein denn damit mache ich doch pixel = bild[i] - 1024; rückgänig...

    lSize ist meine größe vom file
    fwrite (buffer , 1 , lSize , output);

    ich kann nun das bild auch wieder öffnen nur an der Filterung muss ich noch arbeiten 🙂



  • Schau doch mal am Kommentar hinter der Zuweisung, welche Zeile ich genommen habe:

    bild[x] = pixel+1024;// pixel ist dann 0
    

    Tipp: Das ist nicht die Zeile zum Rückgängig machen.



  • Arg ok, Denkfehler...



  • Du willst doch die Punkte <-900 und > 250 löschen.
    Bis jetzt hast du immer pixel = 0 geschrieben

    Rechne doch mal per Hand durch
    Fang in Zeile 29 an für
    a: bild[i] = 0
    b: bild[i] = 1024
    c: bild[i] = 2000

    Was steht dann jeweils in Zeile 39 in bild[i] und pixel ? Passt das zu deinen Vorgaben?



  • Ne passt nicht zu meinen Vorgaben.Ich soll die ja auch 0 oder 1 setzen... laut meiner Rechnung kommt das aber nicht hin.

    Ich will ja die Punkte löschen und nicht die Werte verändern...

    Ich muss den Wert im Datensatz auf 0 setzen aber ich will immer den Wert des Pixels auf 0 setzen...

    aber irgendwie komme ich grade nicht weiter.

    Mit pixel=bild[i]- 1024

    setze ich ja den CT Wert des pixels, so das ich filtern kann.
    Und in bild[i] steht sonst 0-4095.

    Aber wie mach ich das jetzt, dass ich den Datensatz auf 0 bzw. 1 setze und nicht den CT-Wert des Bildpunktes?

    Ich hab jetzt pixel=-1024 gesetzt und das entspricht ja 0

    Ich hab nun auch ein Bild welches ohne helle stellen ist also der Knochen ist weg. Aber das Gehirngeweben sieht nur so aus als wenn dort der Kontrast hochgestellt wurde.

    lg Zermy



  • Hey,

    Nun habe ich ein Resultat, welches mir ein gefiltertes Bild ausgibt. Ich habe das Programm noch so erweitert, dass man nun den Namen der Datei eingeben kann und der Pfad nicht mehr fest ist.

    Vielen Dank nochmal für eure Hilfe und Unterstützung!!!

    Ich kümmere mich jetzt erstmal ums Rauschen und dann um den Zoom 🙂
    Evtl. hört ihr dann nochmal von mir 😉

    Ich werde aufjedenfall dabei bleiben und c programmieren!

    for(x=0;x<512*512;x++)
    {
    	short pixel;
    
    	pixel = bild[i] - 1024;
    
    	if((pixel<-900)||( pixel>250))
     {
    
    	 pixel=-1024;
    	bild[i]=pixel +1024;
    
     }
    
    	i++;
    
    }
    

    LG Zermy



  • Hey,

    Ich bins nochmal... jetzt geht es darum aus dem gleichen Programm nur anderes Bild, die Pixel zu vergleichen um einen Glättungseffekt zu erzielen.

    Das komplette Bild ist ja bereits im Speicher und das bild[i] steht am Anfang des zu lesenden Bereiches.

    Die Frage ist nun nur ob ich das Bild in eine Matrix einlesen muss oder ob ich dies in dem Speicher lassen kann.

    Ich verstehe noch nicht wie ich alle umliegenden Pixel erreichen soll, wenns im Speicher bleiben soll.

    Wenn ich das pixel i hab dann muss ich ja nur um rechts und links das pixel davon zu erreichen, i+1 bzw. i-1 rechnen. Aber wie soll ich die dadrüber erreichen? Ich meine im Speicher wird dies doch auch in Zeilen und Spalten gespeichert also müsste man doch mit i+512 das pixel unter i erreichen oder sehe ich das falsch?

    bild = (short *)buffer;
      for(i=0; i < (lSize / sizeof(short)-1); i++)
      if ((bild[i] == suchwerte[0]) && (bild[i+1] == suchwerte[1])  ) break;
    
      i+=(4/sizeof(short));
    
      printf("%d\n",i);
      printf("%d",lSize);
    
    for()
    {
            short pixel;
            short pixelnachbar;
            pixel = bild[i] - 1024;
    
    		bild[i-1]
    		bild[i+1]
    
    }
    

    Im der nächsten Aufgabe soll dann ein Zoom erzeugt werden. Nicht mehr 512x512 sonder 256x256. Da müsste ich ja dann die umliegenden Pixel mit dem wert von einem Pixel bestücken.

    Aber nun erstmal zu der Aufgabe 2 🙂

    lg Zermy



  • Zermy schrieb:

    Das komplette Bild ist ja bereits im Speicher und das bild[i] steht am Anfang des zu lesenden Bereiches.
    Die Frage ist nun nur ob ich das Bild in eine Matrix einlesen muss oder ob ich dies in dem Speicher lassen kann.

    Kann so bleiben.
    Und wenn du noch bild = bild+i; i = 0; einfügst ist die ganze Sache evtl ein bisschen leichter handhabbar. Dann fängt der Bildindex immer wieder bei 0 an.
    Dann brauchst du das i nicht mehr und kannst andere Zählvariablen nehmen.

    Zermy schrieb:

    Wenn ich das pixel i hab dann muss ich ja nur um rechts und links das pixel davon zu erreichen, i+1 bzw. i-1 rechnen. Aber wie soll ich die dadrüber erreichen? Ich meine im Speicher wird dies doch auch in Zeilen und Spalten gespeichert also müsste man doch mit i+512 das pixel unter i erreichen oder sehe ich das falsch?

    Ist richtig. Du musst nur an den Rändern aufpassen.

    bild = (short *)buffer;
      for(i=0; i < (lSize / sizeof(short)-1); i++)
      if ((bild[i] == suchwerte[0]) && (bild[i+1] == suchwerte[1])  ) break;
    
      i+=(4/sizeof(short));
    
      printf("%d\n",i);
      printf("%d",lSize);
    
      bild = bild+i; i = 0; // <-- Hier eingefügt, dann sind ab bild nur Bilddaten 
    
    for()
    {
            short pixel;
            short pixelnachbar;
            pixel = bild[i] - 1024;
    
            bild[i-1]
            bild[i+1]
    
    }
    


  • Hey,

    danke für die schnelle Antwort DirkB!

    Das Randproblem wollte ich lösen indem ich

    for(x=1;x<511*511;x++)
    

    Dann läuft er ja nicht bis zum Rand.

    Aber mit dem durchgehen und vergleichen ist mir nicht ganz klar.

    Ich brauche ja erstmal eine neue Variable in der ich short Werte ablegen kann.

    short mittel;
    

    in der for-Schleife muss ich ja nun

    bild = bild+i; 
      i = 0;   // bild nur Bilddaten
    
    for(x=1;x<511*511;x++) // Randproblem gelöst
    {
            short pixel;
    		pixel = bild[i] - 1024;
    
    		pixel1=(bild[i]+bild[i-511]+bild[i+511]);
    		i++;
    		pixel2=(bild[i]+bild[i-511]+bild[i+511]);
    		i++;
    		pixel3=(bild[i]+bild[i-511]+bild[i+511]);
    		mittel=(pixel1+pixel2+pixel3)/9;
    
    		bild[i]=mittel+1024;      
    }
    

    Ich mache aber irgendwie ein Denkfehler ich hab ja sozusagen.

    pixel1 pixel2 pixel3
    pixel1 pixel2 pixel3
    pixel1 pixel2 pixel2

    Addiere die dann und errechen mein mittel und schreib dann den Wert in Bild. Nehme mittel dann noch +1024 und dann sollte das doch gehen 🙂 ?

    Bekomme aber ein Speicher Fehler...

    lg Zermy



  • Das for(x=1;x<511*511;x++) wird nicht funktionieren, da du so nur die letzten Punkte nicht hast.
    Du musst zwei Schleifen verschachteln.

    Aus Zeile y und Spalte x berechnest du dann i = y * 512 + x;

    Überleg mal:

    pixel1 pixel2 pixel3 
    pixel4 pixel5 pixel6
    pixel7 pixel8 pixel9
    

    Du willst pixel3 bearbeiten, dann ist pixel1 eine Zeile Weiniger und 1 Spalte mehr.



  • DirkB schrieb:

    Du musst zwei Schleifen verschachteln.

    Aus Zeile y und Spalte x berechnest du dann i = y * 512 + x;

    Klingt spannend! 🙂

    DirkB schrieb:

    Überleg mal:

    pixel1 pixel2 pixel3 
    pixel4 pixel5 pixel6
    pixel7 pixel8 pixel9
    

    Du willst pixel3 bearbeiten, dann ist pixel1 eine Zeile Weiniger und 1 Spalte mehr.

    In deinem Beispiel will ich doch pixel5 nehmen und mit den umliegenden vergleichen und allen den wert von pixel5 geben.

    Vll. war glätten nicht richtig. Das Bild ist "verschwommen" und soll danach etwas klarer sein.

    lg Zermy


Anmelden zum Antworten