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