2016-04-18 4 views
2

Ich versuche, ein paar Sprites aus einem alten PC-Spiel zu rippen. Ich habe die Sprites gefunden und sie in einzelne Dateien in Graustufen gerippt. Jetzt versuche ich herauszufinden, wie man sie einfärbt. Es scheint keine Palettendaten in der ausführbaren Datei oder ihren Datendateien zu geben - dies, zusammen mit der Farbtiefe, die das Spiel benötigt (256 Farben), lässt mich glauben, dass jedes Byte tatsächlich ein 8-Bit-Echtfarbwert ist.Byte-Array zu einem 8-Bit-TrueColor-Bild

sagen, dass ich ein (verkürzt in diesem Fall) Array, das als solches aussieht:

12 11 12 11 
0A 13 12 11 
13 12 11 0A 
12 11 13 13 

Einige Beispielcode ähnlich dem, was ich bin mit dem Bild zu schreiben, sieht aus wie so:

DataInputStream dis = new DataInputStream(new FileInputStream("GAME.EXE")); 

dis.skipBytes(bytesToImage); 

BufferedImage bufferedImage = new BufferedImage(columns, rows, BufferedImage.TYPE_BYTE_INDEXED); 

for (int i = 0; i < rows; i++) { 
    for (int j = 0; j < columns; j++) { 
     byte pixel = dis.readByte(); 

     System.out.print(toHexString(pixel)); 

     //For now, greyscale everything. 
     int value = pixel << 16 | pixel << 8 | pixel; 

     bufferedImage.setRGB(j, i, value); 
    } 

    System.out.print(System.getProperty("line.separator")); 
} 

ImageIO.write(bufferedImage, "PNG", new File("test.png")); 

Ich habe sowohl mit dem imageType, der an den Konstruktor übergeben wurde, als auch mit einem manuell übergebenen ColorModel herumgespielt, aber keiner scheint etwas Nützliches zu tun. Ein binäres AND auf dem Pixel und einige Bitverschiebungen setzen das Bild meist auf eine tiefrote Farbe.

Wie würde ich in diesem Fall jedes Pixel auf den richtigen TrueColor-Wert setzen?

+0

Ich habe das schon versucht - wegen der Konvertierung von einem Byte -> int Farbwert, alles ist blau (nur th Die Bits niedrigerer Ordnung sind gesetzt). – HunterP

+0

Ja, du hast Recht. Die Dokumentation sagte "8-Bit-Komponenten" und es bedeutete, dass es 8-Bit verwendet, um RGB anstelle von 8-Bit für jede Farbe zu speichern. – NullUserException

Antwort

0

8 Bit True Color bedeutet, dass die Bits 7 bis 5 rot, die Bits 4 bis 2 grün und die Bits 1 und 0 blau sind. (z. B. RRRGGGBB) Sie müssen diese auf die höherwertigen Bits in einem 24-Bit-True-Color-Modell verschieben.

ein Farbmodell mit 24 Bit für RGB-Farben wie TYPE_INT_RGB oder TYPE_INT_ARGB Verwenden Sie und Ihren 24-Bit-Pixelwert aus dem 8-Bit-Wert ableiten:

int pixel24 = 
    ((pixel & (128+64+32)) << (16+5-5)) | 
    ((pixel & (16+8+4)) << (8+5-2)) | 
    ((pixel & (2+1))  << 6); 

Mit anderen Worten:

int pixel24 = 
    ((pixel & 224) << 16) | ((pixel & 28) << 11) | ((pixel & 3) << 6); 

Or

+1

Würde jemand erklären wollen, warum dies abgelehnt wurde? Ich würde gerne meine Antwort verbessern, um sie nützlicher zu machen. –

+1

Dies ist eigentlich ziemlich nah an dem, was funktioniert hat: 'int r = ((pixel & 0xE0) << 16); int g = ((Pixel & 0x1C) << 11); int b = ((Pixel & 0x03) << 6); bufferedImage.setRGB (j, ich, r | g | b); ' – HunterP

+0

Verwaltet, um die Formatierung in meinem vorherigen Kommentar zu vermasseln, aber danke für die Antwort, brachte es mich auf den richtigen Weg; Leider wird meine Stimme Sie nicht wieder ins Positive bringen. – HunterP