Aus Datei lesen
-
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 dasbild[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 auchi= 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 Zeilebild[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=67698Zeile 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=67698sieht 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