テクスチャの色が int 値として格納されるゲーム クライアントを開発しています。ただし、テクスチャを描画するために 16 ビット カラーを使用する必要がある場合もあります。そのため、32 ビット カラーを 16 ビット カラーに、またはその逆に変換する方法を知りたいです。これらの操作は、バイト シフトを使用してできるだけ速く実行することを好みます。32ビットカラーのグレースケール値を取得する方法も知っていますか?
1896 次
1 に答える
1
public static Int32 16To32(UInt16 color)
{
Int32 red = (Int32)(((color >> 0xA) & 0x1F) * 8.225806f);
Int32 green = (Int32)(((color >> 0x5) & 0x1F) * 8.225806f);
Int32 blue = (Int32)((color & 0x1F) * 8.225806f);
if (red < 0)
red = 0;
else if (red > 0xFF)
red = 0xFF;
if (green < 0)
green = 0;
else if (green > 0xFF)
green = 255;
if (blue < 0)
blue = 0;
else if (blue > 0xFF)
blue = 0xFF;
return ((red << 0x10) | (green << 0x8) | blue);
}
public static UInt16 32To16(Int32 color)
{
Int32 red = ((((color >> 0x10) & 0xFF) * 0x1F) + 0x7F) / 0xFF;
Int32 green = ((((color >> 0x8) & 0xFF) * 0x1F) + 0x7F) / 0xFF;
Int32 blue = (((color & 0xFF) * 0x1F) + 0x7F) / 0xFF;
return (UInt16)(0x8000 | (red << 0xA) | (green << 0x5) | blue);
}
グレースケールに関しては...次の関数を試すことができますが、テストせずに書いただけなので、完全に機能することは保証できません:
public static Int32 Grayscale(Int32 color)
{
Single red = ((color >> 0xA) & 0x1F) * 8.225806f;
Single green = ((color >> 0x5) & 0x1F) * 8.225806f;
Single blue = (color & 0x1F) * 8.225806f;
Int32 grayscale = (Int32)(((red * 0.299f) + (green * 0.587f) + (blue * 0.114f)) * 0.1215686f);
if (grayscale < 0)
grayscale = 0;
else if (grayscale > 0x1F)
grayscale = 0x1F;
return grayscale;
}
于 2013-01-19T23:15:03.627 に答える