转换BMP 16位 到 Open GL ES RGB5551

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

0100111010111111
xR(19)G(26)B(19)

 

GL的对应应该相反:

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值