000
08.11.2004, 13:03 Uhr
~tommes
Gast
|
hI ! Ich bin gerade ein Programm am schreiben, um eine PNG Datei zu öffnen. Leider scheitert es schon beim einlesen der Daten. Allerdings liegt es eher daran dass ich C++ wohl flasch benutze.
Ich möchte eine unsigned int aus einer PNG Datei lesen. Das mache ich wie folgt:
C++: |
//ersten chunk einlesen //erster Teil Länge des Chunks 4 Byte unsigned Integer (nach Spezifikation) unsigned int length = 0; fread(&length, 4, 1, pngFile); cout << "Länge der Daten im Chunk: " << length << "\n";
|
Das Problem ist, daß ich immer den Wert "Länge der Daten im Chunk: 218103808" als Ausgabe erhalte, egal welche PNG Datei ich einlesel. Das gleich passiert mit anderen Integerwerten die ich auslese. Lese ich zB einen Integerwert der Länge 1 Byte ein wie zB:
C++: |
int depth = 0; fread(&depth, 1, 1 , pngFile); cout << "Farbtiefe: " << depth << "\n";
|
dann wird der richtige Wert ausgegeben. Hier ist der komplette Quellcode:
C++: |
#include <iostream.h> #include <stdlib.h> #include <stdio.h> #include <string>
void showPNGData(const char* filename); int check(const unsigned char* signature);
int main( int argc, const char* argv[] ) { if(argc > 1) { showPNGData(argv[1]); exit(0); } else { cout << "Bitte gültige .png Datei als Parameter angeben.\n"; exit(0); } } //end main
void showPNGData(const char* filename) {
FILE* pngFile = fopen(filename, "r");
//Signatur einlesen unsigned char* signature = new unsigned char[8]; fread(signature, 1, 8 , pngFile);
cout << "PNG Datei Signatur: "; for(int i = 0; i < 8; i++) cout << (int) signature[i] << " "; cout << "\n";
//checken ob der Benutzer überhaupt eine gültige png Datei öffnen möchte if( check(signature) == -1 ) { cout << "Keine gültige png Datei angegeben.\n"; exit(0); }
//ersten chunk einlesen //erster Teil Länge des Chunks 4 Byte unsigned Integer (nach Spezifikation) unsigned int length = 0; fread(&length, 4, 1, pngFile); cout << "Länge der Daten im Chunk: " << length << "\n";
//zweiter Teil Typ/Name des Chunks char* type = new char[4]; fread(type, 1, 4 , pngFile);
cout << "Chunk type/name : "; for(int i = 0; i < 4 ; i++) cout << type[i];
cout << "\n";
unsigned int width = 0; fread(&width, 4, 1, pngFile); cout << "Breite des Bildes: " << width << "\n";
fseek(pngFile, 4, SEEK_CUR);
int depth = 0; fread(&depth, 1, 1 , pngFile); cout << "Farbtiefe: " << depth << "\n";
int colorType = 0; fread(&colorType, 1 ,1 , pngFile); cout << "Farbtyp: " << colorType << "\n";
fclose(pngFile); }// end showPNGData
int check(const unsigned char* signature) { unsigned char checkSignature[] = { (unsigned char)137, (unsigned char)80, (unsigned char)78, (unsigned char)71, (unsigned char)13, (unsigned char)10, (unsigned char)26, (unsigned char)10 };
for(int i = 0; i < 8; i++) if(signature[i] != checkSignature[i]) return -1;
return 0; }
|
Ich fände es ganz nett, wenn einer mal kurz diese Programm auf seiner Maschine compilieren würde und meinen Fehler bestätigen kann. Weil ich absolut keine Idee mehr habe was hier flasch läuft. Danke !
tom
PNg Datei Spezifikation (spez Chunk Layout): www.w3.org/TR/PNG/#5Chunk-layout |