Problem beim Laden einer PCX-Datei(C++)
-
Hallo, ich probiere gerade eine PCX-Datei(welche Teil einer anderen Datei ist) zu lesen/laden(mit c++).(Ausgabe erfolgt mit Allegro.
Derzeit tue ich dies wie folgt(Auszug ausm Code):myfile.read((char*)&pcx,sizeof(PCXhead));//Pcxheader wird geladen int index = 0; while(index < 625) //dient nur Testzwecken, ich weiß, dass da Bild die { //Auflösung 25*25 hat(und 256 Farben verwendet) c = (char)myfile.get();//hier gucke ich, ob es ein Längenbyte ist if(c > 192) // oder ein Grafikbyte(>192 = Längenbyte,kleine { // r Grafikbyte und falls =192 // dann folgt darauf ein Grafikbyte mit Farb- c = c -(128+64); //index >191. Die Datei ist RLE kodiert, was ich blabla << (int) c; // dem HEader entnehmen kann, der auch korrekt blabla >> write; //gelesen wird char colour = (char)myfile.get(); for(int i = 0; i < c;i++) { data[index] = colour; index++; } } else if(c == 192)//nächstes byte hat farbindex >191 { data[index] = (char)myfile.get();//Farbe wird eingelesen index++; } else if(c < 192) { data[index] = c; index++; } } c = (char)myfile.get(); if(c == 12)//Palette liegt vor, falls c = 12(dies ist auch der Fall) myfile.read((char*)pal,sizeof(RGB)*256);//Palette wird geladen int j = 0; for(int i = 0; i < 25;i++) { for(int k = 0; k < 25; k++) { bmp -> line[i][k] = data[j];//Müsste eigentlich die Paletteverwenden j++; //aber dann kommt nur müll raus } } draw_sprite(screen, bmp, 50, 50);
Der Header wird, soweit ich das sagen kann, korrekt geladen. Dies schließe ich daraus, dass die richtigen Werte(Ich hab die Datei mal mit nem anderen Programm geladen und die Werte verglichen) in ihm drin stehen und dies auch an de rrichtigen Stelle.
Nur die Ausgabe der Grafik funktioniert nicht richtig. Zwar ist die Form des Bildes zuerkennen, was darauf schließen lässt, dass ich irgendwas richtig mache, jedoch werden nur schwarz und weiß benutzt?!Hiermal der Vergleich:
Richtig:
http://up.picr.de/4209914.jpg
Falsch:
http://up.picr.de/4209907.jpgWeiß jemand woran das liegen könnte?
-
Wie sieht dein RGB struct aus? Bist du sicher dass da kein Padding im Spiel ist?
Wenn sizeof(RGB) != 3 (z.B. 4), dann stimmen die Farben nicht die du liest.Und was du da machst ist mir auch nicht ganz klar:
blabla << (int) c; blabla >> write;
-
Oh, sry hätte ich rauseditieren müssen, das diente nur dem Debuggen^^
Einfach ignorieren, ist n Stringstream.OH, du hast recht, die RGB struktur ist 4 Byte groß. Schade, dann muss ich das ganze nochmal einzeln einlesen^^
Vielen Dank, ich meld mich wenn es daran nicht lag.
-
So, hab das jetzt ausprobiert, indem ich die Palette mit folgendem Code geladen habe:
for(int i = 0; i <256;i++) { pal[i].r = (char)myfile.get(); pal[i].g = (char)myfile.get(); pal[i].b = (char)myfile.get(); }
und bei Allegro das über
int j = 0; for(int i = 0; i < 25;i++) { for(int k = 0; k < 25; k++) { bmp -> line[i][k] = makecol(pal[data[j]].r,pal[data[j]].g,pal[data[j]].b);//makecol } } draw_sprite(screen, bmp, 50, 50);
Funktioniert leider immernoch nicht
-
wie sieht das bild denn jetzt aus?
-
Noch schlechter
Jetzt kann man nur noch die Kopfform sehen.
Ich probier mal ne andere Datei aus(das PCX wird wie gesagt aus einer anderen Datei, in die es eingebettet ist, gelesen)
-
Da das Bild die richtige breite hat, schliesse ich mal darauf dass du 8 bpp Bitmaps verwendest. (Du greifst mit
bmp -> line[i][k]
auf die Bitmap zu, und das funktioniert nur bei 8bpp Bitmaps korrekt)D.h. du solltest nicht
makecol()
verwenden sondern die Bytes 1:1 in die Bitmap reinkopieren, und du solltest die Palette mitset_color()
setzen.Oder besser gleich auf 32 bpp Bitmaps umsteigen.
p.S.: falls das Unsinn sein sollte sorry, ich kenne die Allegro nicht, hab nur eben mal kurz in die Doku geguckt.
-
vielen dank für deine Mühen, habe das ganze jetzt gelöst.
Es lag an einem nicht ausgeführten Befehl von Allegro
set_palette() um genau zu sein. Damit weißt man die Palette dem Bild zu^^ jetzt geht alles ohne Probleme.