Aus Datei lesen



  • Zermy schrieb:

    Das Bild ist doch im Speicher und du hast mich an die richtige Stelle im Speicher gelenkt. Nun muss ich doch nur short für short auslesen und den Wert - 1024 rechnen? So versteh ich das und dann vergleichen ob der Wert größer oder kleiner ist.

    Richtig, nur hat dein Codebeispiel von 15:14 Uhr damit nichts zu tun.

    Bei bild[i] steht ein Wert von dem Bild.

    short pixel;
    
     pixel = bild[i] - 1024; // dann steht in pixel der geändert Wert.
    


  • Ok, sorry der code klemmt sehr bei mir.

    Und die einzelnen Pixel vergleiche ich nun mit fgetc?

    lg Zermy



  • Wieso kommt denn jetzt fgetc ins Spiel? Was soll das denn einlesen?

    Vorhin hast du irgendetwas von "x<-900HU(Luft) oder x>250HU(Knochen) " geschrieben.
    Ich nehme an das sollen deine Grenzwerte sein. Damit musst du rechnen.



  • Da in Pixel jetzt mein geänderter wert steht muss ich Pixel auf <-900 || >250 prüfen, wenn ein der fall ist auf 0 setzen. Wenn das nicht der Fall ist weiter machen.

    Sehe ich das richtig? Und das wäre dann ne IF Anweisung oder?

    lg Zermy



  • Ja.

    Aber das zurückschreiben in das Array nicht vergessen.

    Man kann das Ganze dann aber noch zusammenfassen.



  • Das Programm läuft zwar fehlerhaft, aber es kommt ein Bild mit ganz vielen weißen und schwarzen Punkten 🙂 Naja eigentlich ist das nicht zum Lachen ...

    short pixel;
    
     pixel = bild[i] - 1024;
    
    // Das hast du mir ja vorgegeben, ab hier möchte ich dann gucken ob der wert in  Pixel größer oder kleiner ist und wenn das der Fall ist soll er in die If Anweisung gehen und pixel auf  -1024 also auf 0 im Datensatz setzen. 
    
     if( pixel<'-900'|| pixel>'250')
     {
    	 pixel=-1024;
     }
     else
     {
    	 bild[i+1];
    // Ich will ja das er immer ein pixel weiter springt. Das heißt ich muss bild[i+1] nehmen damit er das nächste mal ein pixel weiter läuft
    // wenn ich mich nicht irre muss ich noch eine For schleife bauen die das dann immer automatisch wiederholt oder denke ich total falsch?
     }
    

    lg Zermy



  • Nein.

    1. musst du in jedem Fall weiterzählen,
    2. das weiteschalten macht doch die for-Schleife drum-herum (s. mein Post von 15:14 Uhr)
    3. fehlt das bild[i] = pixel , wenn du pixel verändert hast.



  • Hmm, ich weiß grade echt nicht was ich falsch mache. Ich stehe an der stelle wo ich anfangen will zu lesen. Vergleiche das Pixel, wenn es ausgefiltert werden muss wirds auf -1024 gesetzt und in bild geschrieben, wenn das nicht der fall ist wir das Pixel einfach in bild geschrieben und i zählt einen hoch für das nächste Pixel.

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

    lg Zermy



  • Hier nochmal das ganze, macht aber nun das Bild kaputt!

    Man kann es nicht mehr öffnen.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main () {
      FILE * pFile;
      long lSize;
      char * buffer;
      size_t result;
      int i,n=0,x,y,z,v=0;
      short c;
      short suchwerte[2] = {0x7FE0,0x0010};
      short *bild;
      FILE *output;
      int *b;
          int ch;
    
      pFile = fopen ( "C:\\Dokumente und Einstellungen\\XXXX\\Desktop\\Bilder\\Kopf.IMA" , "rb" );
      if (pFile==NULL) {fputs ("File error",stderr); exit (4);}
    
      output = fopen("C:\\Dokumente und Einstellungen\\XXXX\\Desktop\\Bilder\\Kopf_seg.ima","wb+");
    
          if(output == NULL) 
    
              {fputs ("File error",stderr); exit (4);}
    
      // Anzeige der Filegröße
      fseek (pFile , 0 , SEEK_END);
      lSize = ftell (pFile);
      rewind (pFile);
    
      printf("Filesize:%ld \n",lSize);
    
      // Belegung des Speicher für den kompletten File
      buffer = (char*) malloc (sizeof(char)*lSize);
      if (buffer == NULL) {fputs ("File error",stderr); exit (1);}
    
      // Kopieren des File in Speicher
      result = fread (buffer,1,lSize,pFile);
      if (result != lSize) {fputs ("File error",stderr); exit (2);}
    
      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));
    
      bild = bild+i;
    
    for(x=0;x<512*512;x++)
    {
    	short pixel;
    
    	pixel = bild[i] - 1024;
    
    	if( pixel<'-900'|| pixel>'250')
     {
    	 pixel=-1024;
    
     }
    	bild[i] = pixel;
    	i++;
    
    } 
    
     while(!feof(pFile)) {
    
              ch = fgetc(pFile);
    
              fputc(ch, output);
    
          }
    
    	system("PAUSE");
    
      /* Die Datei ist nun komplett im Speicher :) */
    
      // Schließen und speicher freigeben
      fclose (pFile);
      free (buffer);
    
      return 0;
    
        }
    

    edit durch Seppj: Auf Wunsch des unregistrierten Nutzers versehentlich geposteten Realnamen zensiert.



  • bild = bild+i;  // ab hier zeigt bild wirklich auf deine Bilddaten.
    
    for(x=0;x<512*512;x++)  // Welcher Typ ist denn x?
    {
        short pixel;
    
        pixel = bild[i] - 1024; // Warum denn jetzt i? Welchen Wert hat i denn hier?
    
        if( pixel<'-900'|| pixel>'250')
        {
          pixel=-1024;
    
        }
        bild[i] = pixel;  // das brauchst du nur, wenn du pixel auch änderst. Dann musst du den Wertebereich auch wieder anpassen
        i++;
    }
    

    [/quote]

    Wenn du bild = bild+i; schreibst, musst du danach auch i= 0; machen.
    Oder lass beides weg.

    Trotzdem wichtig: von welchem Typ ist i ?



  • i ist int.



  • i und x sind int.



  • Lass dir mal in Zeile 55 den Wert von i und von lSize ausgeben. Den Zusammenhang zwischen beiden kennst du ja (Hausnummern)

    Welchen Wert hat i, wenn die Suchwerte nicht gefunden werden?
    Zu Zeile 58 bis 74 habe ich schon etwas geschrieben.

    Was soll Zeile 78 bis 84.
    Du hast die Datei komplett in Zeile 41 eingelesen. Danach kann nur EOF kommen.
    Außerdem musst du output auch wieder schließen.

    Du must eigentlich nur buffer in output schreiben. (Was ist das Gegenteil von fread?)

    Und nochmal:

    Zermyy schrieb:

    Die Skala der möglichen Daten in der Datei beträgt also
    0 bis 4095. Diese Werte sind nicht direkt die CT-Werte: CT-Werte reichen von -
    1024 HU bis +3071 HU, von den Werten in der Datei müssen also 1024 abgezogen
    werden, um die tatsächlichen CT-Werte zu erhalten.

    Wenn bei dir jetzt -1024 in den Daten steht, musst du das irgendwie wieder rückgangig machen.
    Du musst dir etwas für die Zeile bild[i] = pixel; überlegen, wie du wieder auf 0 bis 4095 kommst.

    Ich war noch am schreiben, darum kannte ich dein Post von 19:16 vorhin noch nicht. :p



  • Vielen Dank nochmal für deine Hilfe!

    Ich hab nun irgendwie keinen klaren Kopf mehr, bin seit heute morgen dabei.

    Ich werde morgen weiter machen vll magste dir das nochmal angucken. Ich mache jetzt irgendein Fehler, da das ausgegebene bild nun 0 kb groß ist und das ganze CMD abstützt xD

    Ich denke mal ich schreibe über das Array hinaus.

    Ich gucke nachher nochmal rein muss aber mal kurz ne Pause machen.

    lg

    Zermy



  • Zermy schrieb:

    short pixel;
    
    	pixel = bild[i] - 1024;
    
    	if( pixel<'-900'|| pixel>'250')  /* <-- was soll das denn machen? */
    


  • Hey,

    ich kanns net lassen ich will die Aufgabe lösen.

    lSize=659706
    i=67698

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

    fclose hab ich nun gesetzt.

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

    Nur wie das alles aussehen soll weiß ich nicht... ich komm gar nicht so schnell im Lesen hinterher wie ich das hier brauchen tu.

    Nur der Zeitdruck im Nacken ist doof...

    lg Zermy



  • @ wutz,

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



  • Tja, so funktioniert das aber nicht. Short-Werte kann man nicht mit Multichar-Literalen vergleichen.



  • 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


Anmelden zum Antworten