2016-04-18 18 views
2

古いPCゲームからいくつかのスプライトをリッピングしようとしています。私はスプライトを見つけ、それらをグレースケールで個々のファイルにリッピングしました。今私は色付けする方法を工夫しています。実行可能ファイルやそのデータファイルにパレットデータがないように見えます。これは、ゲームに必要な色数(256色)と組み合わせると、実際には各バイトが8ビットトゥルーカラー値であると信じられます。バイト配列から8ビットトゥルーカラーイメージへ

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

I画像を書き込むために使用しているものと同様のいくつかのサンプルコードは、そうのように見える:

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")); 

のような見えるアレイI(この場合には短く)していると言います

私は、コンストラクタに渡されたimageTypeとColorModelを手動で渡していたのですが、どちらも役に立ちません。バイナリのANDをピクセルで行い、ビットシフトするとほとんどがイメージを濃い赤色に設定します。

この場合、各ピクセルを正しいトゥルーカラー値に設定するにはどうすればよいですか?

+0

私はすでにこれを試しています - バイト - > intカラー値からの変換のため、すべてが青色です(th下位ビットがセットされます)。 – HunterP

+0

ええ、そうです。ドキュメントには「8ビットコンポーネント」と書かれていて、色ごとに8ビットの代わりに8ビットを使ってRGBを格納するという意味でした。 – NullUserException

答えて

0

8ビットの真の色は、ビット7〜5に赤が含まれ、ビット4〜2に緑が含まれ、ビット1と0に青が含まれていることを意味します。 (つまり、RRRGGGBB)これらを24ビットの真のカラーモデルの上位ビットにシフトする必要があります。

はTYPE_INT_RGB又はTYPE_INT_ARGBようなRGBカラーの24ビットのカラーモデルを使用し、8ビット値から自分の24ビットの画素値を導出する:すなわち

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

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

または

int pixel24 = 
    ((pixel & 0xE0) << 16) | ((pixel & 0x1C) << 11) | ((pixel & 0x03) << 6); 
+1

誰かがこれがなぜ落とされたのか説明しようと思いますか?私はそれをより有用にするために私の答えを改善したいと思っています。 –

+1

これは実際には動作していたものにかなり近いです: 'int r =((ピクセル&0xE0)<< 16); int g =((ピクセル&0x1C)<< 11); int b =((ピクセル&0x03)<< 6); bufferedImage.setRGB(j、i、r | g | b); ' – HunterP

+0

私の前のコメントで書式設定を取り締まることができましたが、答えてくれてありがとうございました。悲しいことに私の投票はあなたをポジティブに戻さないでしょう。 – HunterP

関連する問題