024
28.08.2006, 13:49 Uhr
ao
(Operator)
|
So, jetzt aber. Der Fehler liegt hier:
C++: |
input.open(name.c_str(), ios_base::in | ios_base::binary);
|
Du liest das File bisher ohne ios_base::binary, d.h. als Textfile, und da ist nun mal beim ersten EOF-Zeichen Feierabend. So wie oben kommen exakt 1403 x 1409 Pixel.
Außerdem hab ich mal versucht, ein bisschen Struktur da reinzubringen und vor allem diese get-character-Orgie in was Lesbares zu verwandeln, und voilà, nach ner halben Stunde sah die Einleseroutine wie folgt aus:
C++: |
#pragma pack (push) #pragma pack (1)
struct tgaheader // abgeschrieben von Wikipedia, siehe Link in Posting 006. { unsigned char imageIdLength; // length of image id. 0 -> no image id unsigned char palette; // 0 = no, 1 = yes unsigned char imageType; // 0 = no image // 1 = palette uncompressed // 2 = RGB 24 bit uncompressed // 3 = monochrome uncompressed // 9 = palette rlc // 10 = RGB rlc // 11 = monochrome rlc
unsigned short startOfPalette; unsigned short lengthOfPalette; unsigned char paletteEntrySize; unsigned short originX; unsigned short originY; unsigned short width; unsigned short height; unsigned char bitsPerPixel; unsigned char imageAttribute; };
struct pix24 { unsigned char r; unsigned char g; unsigned char b; };
#pragma pack (pop)
int main() { string name; ifstream input;
// der Einfachheit halber mal konstant vorgegeben. name = "e:\\ao\\cpp\\yip\\count2.tga"; // cout << "Bitte geben Sie den Namen der zu ladenden Grafikdatei ein: "; // cin >> name; // Datei öffnen input.open(name.c_str(), ios_base::in | ios_base::binary);
// Header einlesen tgaheader header; input.read ((char *) &header, sizeof (header));
// Image-Objekt erzeugen Image picture(header.width, header.height);
int x = 0; int y = 0;
// dies ist DER Pixel-Zähler, einen anderen gibt es nicht! int count = 0;
while (!input.eof ()) { // Daten für ein Pixel einlesen pix24 pix; input.read ((char *) &pix, sizeof (pix));
// Hochzählen und Position des Pixels im Bild berechnen count++; x = count % header.width; y = count / header.width;
// Pixel im Bild setzen picture.setPixel (x, y, pix.r, pix.g, pix.b); }
// Datei schließen, wir brauchen sie nicht mehr. input.close ();
// Fertig. Ab jetzt ausgeben.
cout << count << " Pixel eingelesen!" << endl; cout << "Daten im Objekt \"Image\": " << endl; picture.pDisplay();
// und so weiter
return 0 }
|
Und jetzt vergiss mal deinen Frust, geh ne Stunde radfahren, das Wetter ist grad gut, und dann fang von vorne an.
ao |