windows mobile下的位图

来源:互联网 发布:河北工业大学网络缴费 编辑:程序博客网 时间:2024/05/21 19:34

 

WMWindows Mobile)下的位图有一定的特殊性,可操作API也不多,所以这里重点讲解一下WM的位图知识,但不对位图文件的格式做重点介绍。才疏学浅,特别欢迎高人指正。如果你要看懂这篇文章,需要有一定的基础,并对位图有实际操作经历,因为我不会详述基础知识。

众说周知,程序中Windows标准的图像处理使用的都是BMP格式。在WM下也不例外,所有被存储的图形都是BMP,并且所有windows mobile系列的手机只支持65536色,这就是意味着,手机上显示的图像都是16位的,那么在实际的程序中,创建一个DIB时,用16位位图是比较现实的,图像文件也建议都改成16位的格式。16位的位图在显示上特别是在出现大区域,高相位的惭变操作时,会出现色差,造成惭变不连续的问题。通过抖动算法会处理掉色差,但会降低原32位色的纯度。这就是65536色的问题

 

 

 因此,在做WM界面设计时,尽量不要使用大区域,高相位的惭变设计。

WM中的位图分为DDBDIB

DDB叫做设备相关位图,一般用来做WM软件界面的交换和提取。并对图片执行一些简单的操作,比如截屏,缩放,显示。使用bitbltstrechblt这些函数捣腾的位图,很多是设备相关位图,一般此类位图都与HDC相关。并且只能在内存中,不能以文件的形式存出来。在WM下,无法直接取到DDB位图的像素的RGB阵列

DIB叫做设备无关位图,一般界面上很少用到,但在做一些较复杂的界面特效时会用到DIB位图,它的最大的特点就是能够取到像素的RGB阵列,从而通过对这个阵列的操作,改变图形显示的效果。并且能够存为.BMP文件。所有.BMP格式的文件都是DIB位图,在WM的内存中只能通过CreateDIBSection来创建有DIB特点的位图。网上有很多对这个Section的解释,说是DDBDIB的混合体。不懂,我就把它当DIB位图来看了。创建这个位图有很多参数。我拣紧要的说一下:

先看代码:

//建立这个位图的内存空间,并初始化结构,这个指针是要做CreateDIBSection参数的

int iSize = sizeof(BITMAPINFO)

BITMAPINFO* pBMI = (BITMAPINFO*) malloc(iSize);

memset(pBMI, 0, iSize);

 

// 填充结构数据,BITMAPINFO结构里面带一个BITMAPINFOHEADER结构,和一个调色板或掩码

pBMI->bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);

pBMI->bmiHeader.biWidth       = 2048;//位图宽,单位是像素

pBMI->bmiHeader.biHeight      = 512;//位图高,单位是像素

pBMI->bmiHeader.biPlanes      = 1;   //不懂,只能设1

pBMI->bmiHeader.biBitCount    = 16;   // 位深,就是一个像素用几个位来表示,这是16,216次方就是65536,所以说16位只能表示65536种色彩

//pBMI->bmiColors;//对这个参数我很无语。用不来,我的理解:这个参数在16位以下,不包括16位的数据格式用的是调色板,就是一个表,存上了图像中所有要用的像素RGB值。在16位以上,包括16位的数据格式就是每个像素的掩码值,每个像素的RGB值会与这个掩码做与运算一次。因为16位以上的数据就没有调色板了。所以这里的数据只记录RGB三色的掩码,但是没有格式的说明。

//pBMI->bmiHeader.biCompression = BI_BITFIELDS; //压缩属性

pBMI->bmiHeader.biCompression = BI_RGB; // 压缩属性

 

BYTE* pBits ;

HBITMAP hbitmapTexture = CreateDIBSection( hdc,

         pBMI,

         DIB_RGB_COLORS,

         //DIB_PAL_COLORS,//只能在8位色深上可用,使用系统DC的调色板

         (VOID **) &pBits,

         NULL,

         0);

代码中BITMAPINFOHEADER结构中还有一些数据没有填,直接默认为初始值,具体的查阅一下MSDN。在对biCompression格式设定要注意:当biCompression设为BI_RGB时,我这个DIB位图的像素RGB阵列就只能是555格式,后面pBMI->bmiColors这个参数就可以直接默认初始值了,当设为BI_BITFIELDS,可能是555,也可能是565,事实上我认为createdibsection创建成的DIB位图就是RGB555的格式,没有565。待解!

这样一个没有数据的DIBhbitmap就创建出来了,当你bitblt一个选内这个DIB位图的内存DC时,pBits的数据就被填充了,就能够得到像素RGB阵列了,这个方法也可以转换一个DDB成为DIB

特别指明的是在使用SHLoadImageFile函数加载图像数据时,无论你使用是什么位深,都会转换为16位,并且能获得的bitmap格式中的pBits像素数据(DDB位图中pBits数据是空的)。采用RGB565格式正序排列的,在photoshop中,存出的位图默认是以倒行序排列的,当在存储时有一个翻转行序选项时,选上后存储才是正行序排列像素数据。

当在使用CreatDIBSection函数创建设备无关位图数据时,也是倒行序。

 

原创粉丝点击