| Autor |
Nachricht |
basti273
Mitglied
Benutzerprofil
Anmeldungsdatum: 17.06.2011
Beiträge: 14
|
basti273 Mitglied
22:28:02 02.04.2012 Titel: |
Aus Datei lesen |
Zitieren |
Hey Leute,
ich habe eine Aufgabe, an der ich schon stundenlang sitze , aber keinen Schritt weiterkomme.
Prinzip ist grob, dass wir eine DICOM-Datei vorgegeben haben und aus der sollen wir alle Bildpunkte auslesen und dann bestimmte Punkte ändern, sodass sich dann letztendlich die Farben im Bild ändern.
Mein Problem ist allerdings, dass ich nicht genau weiß wie ich die Bildpunkte auslese, da ich keinerlei Informationen darüber vorgegeben habe, nur dass die Bildpunkte nach der hexadezimale Zahlenkombination (0x7FE0,0x0010), und dann noch 4 char variablen überspringen, anfangen.
An die Stelle soll ich wohl mit fseek springen und dann anfangen die Bildpunkte eines 512x512 großen Bildes auszulesen.
Hab leider gar keinen Ansatz.
Letztens hatte ich ähnliches, aber mit vorgegebenem header-Dateien und hier weiß ich gar nicht wie und woraus ich irgendwie lesen soll.
Gruß,
basti |
|
|
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5613
|
dot Mitglied
22:31:40 02.04.2012 Titel: |
|
Zitieren |
Ich würd mal sagen: Das hier wär wohl ein guter Anfang. |
_________________ one point of view will never reveal the entire scene.
|
|
 |
basti273
Mitglied
Benutzerprofil
Anmeldungsdatum: 17.06.2011
Beiträge: 14
|
basti273 Mitglied
22:49:08 02.04.2012 Titel: |
|
Zitieren |
könnte man dann mit:
fseek(pFile,(short)132*sizeof(char),0);
an den Anfang der Bildpunkte springen?
Wenn ja, wie liest man dann die Punkte aus? |
Zuletzt bearbeitet von basti273 am 23:05:56 02.04.2012, insgesamt 1-mal bearbeitet |
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
08:04:21 03.04.2012 Titel: |
|
Zitieren |
| basti273 schrieb: | könnte man dann mit:
fseek(pFile,(short)132*sizeof(char),0);
an den Anfang der Bildpunkte springen? |
Das (short) ist überflüssig, sizeof(char) ist per default 1.
Und für die 0 gibt es das Makro SEEK_SET
Die Kennung ab Position 128 solltest du zur Sicherheit auch mit einlesen.
Dann weißt du, dass dein Format richtig ist.
| basti273 schrieb: | | Wenn ja, wie liest man dann die Punkte aus? |
Wie ist denn das Format von den Daten, hast du da schon was rausgefunden?
Binärdaten kanns tu mit fread oder fgetc lesen.
Du musst aber auf die Bytereihenfolge achten. |
|
|
|
 |
basti273
Mitglied
Benutzerprofil
Anmeldungsdatum: 17.06.2011
Beiträge: 14
|
basti273 Mitglied
08:20:21 03.04.2012 Titel: |
|
Zitieren |
Bin jetzt mit folgendem an den ersten Bildpunkt gesprungen.
| C++: | fseek(pFile, 128*sizeof(char), SEEK_SET);
fseek(pFile, 4*sizeof(char), SEEK_CUR); | |
Ja, als Tipp wurde vorgegeben, die Bildpunkte als short auslesen zu lassen.
Dann soll man jeden einzelnen Punkt auslesen im Wert ändern.
Aber das auslesen klappt nicht.
bei fread fehlt mir auch irgendwie immer was...
Weiß da nicht so recht, wie ich da rauslesen soll, da ich iwie keine bestimmte adresse habe. |
Zuletzt bearbeitet von basti273 am 08:24:44 03.04.2012, insgesamt 2-mal bearbeitet |
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
08:28:50 03.04.2012 Titel: |
|
Zitieren |
Dann zeig mal etwas mehr Code.
Auf welchem System und mit welchem Compiler arbeitest du?
Das auslesen als short soll vermutlich ein 16-Bit-Integer (2 Byte) bedeuten.
Was sagt denn die Dokumentation zur Bytereihenfolge? |
|
|
|
 |
basti273
Mitglied
Benutzerprofil
Anmeldungsdatum: 17.06.2011
Beiträge: 14
|
basti273 Mitglied
08:34:49 03.04.2012 Titel: |
|
Zitieren |
Ich arbeite mit Microsoft Visual Studio.
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <stdio.h>
#define SIZE 50
int main(void)
{
FILE *pFile;
char filename[SIZE];
printf("Welche Datei wollen sie oeffnen: ");
scanf("%s", &filename);
pFile = fopen(filename,"rb");
if(pFile)
{
printf("Datei wurde geoeffnet!\n");
fclose(pFile);
}
else
{
printf("Datei konnte nicht gefunden werden.\n");
}
pFile = fopen(filename, "rb");
fseek(pFile, 128*sizeof(char), SEEK_SET);
fseek(pFile, 4*sizeof(char), SEEK_CUR);
printf("\n\n");
return 0;
} | |
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 | "Also am Anfang überprüfen, ob es die Datei gibt und dann öffnen und an die erste Stelle des Bildes springen, den header sozusagen überspringen.
Zunachst kommt der so genannte Header der Datei, der eine
Menge an anderen Informationen enthalt (um die wir uns NICHT kummern)
und auch eine variable Groe besitzt. Danach kommt an einer bestimmten Stelle
die Information, dass nun die Bilddaten kommen. Diese Information ndet sich
dadurch, dass man die Daten (als short!) einliest und wenn die hexadezimale Zahlenkombination
(0x7FE0,0x0010) gefunden wird, mussen noch vier char-Daten
ubersprungen werden, dann kommt als long die Anzahl der Bildpunkte und dann
beginnen die Bilddaten (nachzulesen im DICOM-Standard). Die Groe der Bilder
ist (bei der Computertomographie) 512 512 und die Bilddaten sind als short-
Variablen gespeichert." | |
Das wär der Auszug zum Auslesen, der Schritt fehlt mir eigentlich.
Brauch ich da nicht iwie auch einen Pointer auf die Bildpunkte? Hab ich auch nicht so wirklich.
Muss ja jeden Bildpunkt abtasten und auslesen.
Für den fseek(); befehl muss ich ein anderen pointer als den FILE pointer nehmen oder? |
Zuletzt bearbeitet von basti273 am 09:16:08 03.04.2012, insgesamt 3-mal bearbeitet |
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
09:40:24 03.04.2012 Titel: |
|
Zitieren |
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <stdio.h>
#define SIZE 50
int main(void)
{
FILE *pFile;
char filename[SIZE];
// Wo sollen denn deine Daten gespeichert werden ?
printf("Welche Datei wollen sie oeffnen: ");
scanf("%s", &filename);
// Da ^ kommt bei Arrays kein & hin
pFile = fopen(filename,"rb");
if(pFile)
{
printf("Datei wurde geoeffnet!\n");
fclose(pFile);
}
else
{
printf("Datei konnte nicht gefunden werden.\n");
// Und was jetzt? Dein Programm läuft weiter als wäre nichts gewesen
}
pFile = fopen(filename, "rb");
fseek(pFile, 128*sizeof(char), SEEK_SET);
fseek(pFile, 4*sizeof(char), SEEK_CUR);
// wo ist das lesen mit dem du Schwierigkeiten hast?
printf("\n\n");
return 0;
} | |
Bitte poste hier deinen Code mit dem du arbeitest (per Copy and Paste) |
|
|
|
 |
basti273
Mitglied
Benutzerprofil
Anmeldungsdatum: 17.06.2011
Beiträge: 14
|
basti273 Mitglied
10:32:46 03.04.2012 Titel: |
|
Zitieren |
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <stdio.h>
#define SIZE 50
int main(void)
{
FILE *pFile;
char filename[SIZE], pixelarray[512][512]; // ins pixelarray sollen die werte gespeichert werden
char *pixptr = pixelarray;
int bildgroesse, bildhoehe=512, bildbreite=512, i, j;
printf("Welche Datei wollen sie oeffnen: ");
scanf("%s", filename); // kein & mehr
pFile = fopen(filename,"rb");
if(pFile)
{
printf("Datei wurde geoeffnet!\n");
fclose(pFile);
pFile = fopen(filename, "rb");
fseek(pFile, 128*sizeof(char), SEEK_SET);
fseek(pFile, 4*sizeof(char), SEEK_CUR);
fread(&pixptr, sizeof(short), 1, pFile); // auslesen der daten mit fread... aber bin nicht sicher, ob das mit dem pixptr richtig ist...
bildgroesse = bildbreite*bildhoehe;
printf("Die Bildgroesse ist %d Bytes.", bildgroesse);
for(i=0; i<bildhoehe; i++) // jeden bildpunkt abtasten
{
for(j=0; j<bildbreite; j++)
{
if(pixelarray[i][j] < -900 || pixelarray[i][j] > 250)
{
pixelarray[i][j] = -1024;
}
}
}
}
else // die schleife jetzt am ende, damit das programm danach nicht weiterläuft
{
printf("Datei konnte nicht gefunden werden.\n");
}
printf("\n\n");
return 0;
} | |
jetzt weiß ich nicht so wirklich weiter, brauch iwie glaub ich ein anderen pointer oder das array anders... |
|
|
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
10:49:33 03.04.2012 Titel: |
|
Zitieren |
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ...
char filename[SIZE], pixelarray[512][512]; // ins pixelarray sollen die werte gespeichert werden
char *pixptr = pixelarray;
...
pFile = fopen(filename,"rb");
if(pFile)
{
printf("Datei wurde geoeffnet!\n");
fclose(pFile);
:arrow: // Was soll denn der Mist :confused: fclose und gleich danach fopen?
pFile = fopen(filename, "rb");
...
fread(&pixptr, sizeof(short), 1, pFile); // auslesen der daten mit fread... aber bin nicht sicher, ob das mit dem pixptr richtig ist...
:arrow: // Du liest gerade genau 1 short ein und nicht etwa 512x512
:arrow: // Zudem ist pixptr schon ein Pointer und der braucht hier kein & mehr
bildgroesse = bildbreite*bildhoehe; :arrow: // zu spät. musst du früher machen
printf("Die Bildgroesse ist %d Bytes.", bildgroesse);
... if(pixelarray[i][j] < -900 || pixelarray[i][j] > 250)
:arrow: // pixelarray ist ein Array das char-Element aufnimmt. Wie willst du da Werte < 128 und > 127 drin abspeichern?
...
pixelarray[i][j] = -1024;
else // die schleife jetzt am ende, damit das programm danach nicht weiterläuft
:arrow: // if ist keine Schleife sondern eine Bedingung
...
} | |
| basti273 schrieb: | | jetzt weiß ich nicht so wirklich weiter, brauch iwie glaub ich ein anderen pointer oder das array anders... |
Du brauchst ein C-Buch und das Kapitel über Arrays und Pointer.
Woher kennst du die Bildgröße?
Mach dir erst einmal klar was du einlesen willst.
Von welchem Typ sind die Daten? char, short oder sonstwas. |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|