2012-02-22 8 views
0

32ビットpngファイルを16ビットファイルフォーマットに変換しようとしていますが、16ビットファイルフォーマットを相互に変換する方法を理解しています(RGB565 RGBA4444など)。私は32ビットから16ビットに変換する方法についてはわかりません。OpenGL C++:32ビットpngファイルを16ビット565RGBファイルに変換する方法

私の主な質問は次のとおりです。32ビットのpngがどのように格納されているかを調べるにはどうすればよいですか?R、B、G、Aの各値に8ビットが割り当てられていますか?

精度を失いますが、おおよそ同じ値を維持する方法を教えてください。事前

+1

これは本当に2つの質問です:1)私はどのようにPNGを解凍するのですか? 2)32ビットカラーを16ビットカラーに変換するにはどうすればよいですか? #1の答えはlibpngを使うことです。 "理解したい"場合は、[PNG specification document](http://www.libpng.org/pub/png/spec/)を参照する必要があります。 PNGを解凍するのは簡単なことではありません。 PNGは圧縮された画像です。情報を圧縮形式で格納します。それを読むことは複雑です。そのため、PNGを読み込むほとんどすべてのツールでlibpngを使用して圧縮解除されています。 –

答えて

1

ありがとうございます手でこれを実装するよりもlibpngを使用してオフにはるかに良いと思います。

+0

これは私が理解したいことですが、 – James

0

私は、32ビットのPNGピクセルの正確なレイアウトに慣れていないけど、それはあなたがおそらくこれに似た何かをしたい、他のフォーマットと比較的一致していると仮定すると:

// Get the pixel from the png: 
unsigned int pngPixel = getPngPixel(); 

unsigned char r = (pngPixel & 0xFF000000) >> 24; 
unsigned char g = (pngPixel & 0x00FF0000) >> 16; 
unsigned char b = (pngPixel & 0x0000FF00) >> 8; 
unsigned char a = (pngPixel & 0x000000FF); 

// you can collapse this to one line, but for clarity... 
// masking off the least significant bits. 
unsigned short rgb565Pixel = (r & 0xF8) << 11; 
rgb565Pixel |= (g & 0xFC) << 5; 
rgb565Pixel |= (b & 0xF8); 

// Again you could collapse this down to one line, but for clarity... 
// masking off the least significant bits. 
unsigned short rgba4Pixel = (r & 0xF0) << 12; 
rgba4Pixel |= (g & 0xF0) << 8; 
rgba4Pixel |= (b & 0xF0) << 4; 
rgba4Pixel |= (a & 0xF0); 

この擬似コードを考えてみましょう。

特に8ビットから4ビットに変換するときに、最下位ビットをマスキングすることは、2つの間で変換するにはあまり適していないと主張できます。代わりに、変換関数を使用することができます:

unsigned int convertColor(unsigned char c, unsigned int oldMax, unsigned int newMax) { 
    double oldColor = c; 
    double percentOfMax = oldColor/oldMax; 
    return ((unsigned int)(newMax * percentOfMax)) & newMax; 
} 

// now we can do this 
unsigned short rgba4Pixel = convertColor(r, 0xFF, 0x0F) << 12; 
rgba4Pixel |= convertColor(g, 0xFF, 0x0F) << 8; 
rgba4Pixel |= convertColor(b, 0xFF, 0x0F) << 4; 
rgba4Pixel |= convertColor(a, 0xFF, 0x0F); 
+0

PNGは圧縮されています。それは親切です。シンプルな32ビットRGBA形式ではデータを保存しません。 –

+0

私はそこにポイントを逃したと思った。私は彼がすでにPNGを解凍していると思った。 – grieve

関連する問題