当前位置: BOLT界面引擎 > 知识库文章 > XLGraphic位图注意事项

XLGraphic位图注意事项

作者:李亚星 2012-09-06

XLGraphic里面提供了引擎自定义的位图格式,直接操作位图的bufferwindows操作系统的HBITMAPHICONxl_bitmap的转换,都是较为复杂的,如果在开发中遇到了此类开发需求,并且没有100%把握自己开发的,那么请使用XGP(XLGraphicPlus.dll),里面已经有较为完备的接口(如果不满足需求请直接联系我们);如果的确需要自己开发,那么需要非常小心,并且注意以下注意事项:

 

 

         关于XL_BITMAP的色深

         目前xl_bitmap支持的色深包括:32(alpha通道)24(rgb各三个byte)256级灰度图(1byte),所以调用XL_CreateBitmap创建位图时候,只可以是上面三种色深中的某一种,一般情况没有意外,都是32

         另外创建出来的位图,如果想设置到ImageObject里面去,或者调用图形库的各种图像操作接口来操作,那么必须是32位位图

        

         关于XL_BITMAP的字节序

l  图形库和xlue里面使用的颜色都是XL_ColorXL_Color的字节序(由低到高)BGRA,和windows开发中的COLORREF不同,COLORREFRGBA

l  XL_Color可以通过XLGraphic.h里面的几个宏来操作,比如XLCOLOR_BGRA_A来获取R通道,通过XLCOLOR_BGRA来拼凑一个XL_Color

l  32bitmap的每个像素的值就是XL_Color,字节序是BGRA

l  24bitmap的每个像素值字节序是BGR

l  XL_BITMAP里面buffer的字节序,和windows下面的设备无关位图DIBbuffer字节序是一致的,行对齐方式也一致

 

关于32bitmap的预乘

l  进入xlue的渲染链的带alpha通道的32位图,都需要经过预乘,否则做alpha混合会导致失真

l  资源xml里面配置的bitmap,通过xarManagerGetBitmap获取出来的,都是经过预乘的

l  经过预乘的位图直接保存,会导致失真

l  预乘是不可逆运算,经过预乘的位图,会导致部分信息量的丢失

l  只有带alpha通道的png32bmp格式文件加载才会进行预乘处理

l  XLGraphicXGP分别有直接加载各种图片格式,而不经过预乘运算的接口,比如XL_LoadPngFromFile就是直接加载png,但不预乘

l  图形库的XL_PreMultiplyBitmap接口可以用来对一张32位位图进行预乘

l  图形库的XL_IsBitmapPreMultiplied接口可以用来判断一张位图是否经过预乘

 

 

         如果使用XL_GetBitmapBuffer,那么有以下默认规则(非常重要)

1.         首行在buffer最前位置,也就是XL_GetBitmapBuffer(0,0)取出来的一定是第一行起始地址

 

2.         不同色深的位图,每个像素所占字节数不同,切忌越界

比如本来是24位位图,确当成32位来处理,非但会导致显示出错,而且可能会导致内存写越界;在操作未知的xl_bitmap之前,首先需要判断位图的色深,然后做相应的处理,不要自认为都是32位的来处理

 

3.         扫描行长度(XLBitmapInfoscanLineLength字段),是从当前行跳到下一行的唯一手段

比如XL_GetBitmapBuffer(0,0)取到了第一行的行首buffer,那么向后偏移一个扫描行,就是第二行的行首了

 

4.         XL_ClipSubBindBitmap 剪裁出来的位图和原位图共用一个buffer

顾名思义,就是从一张大位图剪裁出一个小位图,剪裁后,小位图并没有创建自己的buffer,所以对小位图的修改都会反映到原始位图上面去。两个位图的扫描行是相同的,从小位图的当前行跳转到下一行,使用扫描行来计算偏移。如果小位图需要有自己独立的buffer,那么在clip之后,调用XL_CloneBitmap

 

5.         Bitmapbuffer不一定是连续的!一行的末尾并不一定是下一行的开始

因为可以从一张较大的位图clip出一张较小的位图出来,这种情况下,两张位图会公用一个buffer

所以对于不确定来源的位图,切不可以使用memcpy等函数直接操作buffer,必须逐行处理

 

6.         所有内存行都是4字节对齐的,所以字节数*width 不一定等于扫描行长度

另外在存在剪裁的情况下,这个值更是不想等,一个剪裁出来的小位图,width非常小,但是scanLineLength可能会很大,和原始位图是一致的。

 

 

         另外新版的XLGraphic,在日志版对buffer做了越界检测,如果有操作导致越界,会在第一时间弹出错误提示,所以如果有直接操作buffer的地方,最好使用XLGraphic的日志版多进行测试

 

         图片的处理和多种色深的位图等等,向来都是windows开发中的难点,细节非常多,也极其容易出问题,XLGraphicXLGraphicPlus两个库已经提供了较为完备的支持,希望大家在开发中多加使用;如果有什么问题或者建议,请及时联系我们。

迅雷公司 版权所有 Copyright 2003-2010 Thunder Inc.All Rights Reserved. 意见反馈:xl7doc@xunlei.com