1. 使用ACDSEE 转换24位到16位,分析bmp左下角第一个像素点。
24bit BGR (0xFF, 0xCC, 0x99)
16bit RGB555 (0x5F, 0x4F)
转2进制
0101 1111 0100 1111
注意啦,要进行高低位翻转。
0100 1111 0101 1111
2. RGB555 对应的值应该是
B16 = 31 * 255 / 255 = 31
G16 = 31 * 204 / 255 = 24
R16 = 31 * 153 / 255 = 18
3. bmp 5551 16位的对应
显然 B 对应11111,于是有bmp
0 10011 10101 11111 x R(19) G(26) B(19)
GL的对应应该相反:
10011 10101 11111 0 R(19) G(26) B(19) x
可见BMP中16bit的排序是ARGB, 而OpenGL ES中16bit的排序是 RGBA.
转换方式:向左移一位就行了。见转换方案2
4. 转换方案1
struct ABGR16_555 // bmp argb
{
WORD b: 5 ;
WORD g: 5 ;
WORD r: 5 ;
WORD x: 1 ;
};
struct RGBA16_555 // gl rgba
{
WORD x: 1 ;
WORD b: 5 ;
WORD g: 5 ;
WORD r: 5 ;
};
ABGR16_555* pARGB = (ABGR16_555*)pSrc;
RGBA16_555* pRGBA = (RGBA16_555*)pDst;
pRGBA->r = pARGB->r;
pRGBA->g = pARGB->g;
pRGBA->b = pARGB->b;
pRGBA->x = 1; // 不透明
5. 转换方案2
WORD w = MAKEWORD(pSrc[0], pSrc[1]);
w <<= 1;
w |= 1; // 不透明pDst[0] = LOBYTE(w);
pDst[1] = HIBYTE(w);
6. OpenGL ES中使用 RGB5551
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pTexture->iWidth, pTexture->iHeight, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, pTexture->pImage);