wbmp图像解码

王朝other·作者佚名  2006-01-09
宽屏版  字体: |||超大  

wbmp图像解码

lmjx 2004/10/26 Email:limiao@yeah.net

WBMP 是无线的图象格式,目前仅支持未压缩的黑白图象。

所有的WBMP 文件在位于实际图象元素之前都有一个"Header" 标头部分,标头部分的第一个八位位组指明了WBMP的型态。因为目前只有型态0(黑白,非压缩)的 WBMP 格式被定义,第一个8个位组应该为零,接下来的就是固定标头部分,也为0。

下一个八位位组指出了图象的宽度。宽是指图象的水平尺寸,用多字节整数格式表示,一个多字节整数由一个或多个字节构成。一个多位整数中,每个字节的第0bit告诉我们是否有更多的构成该多位整数的字节跟随在其后面。如果该字节的第0bit 是0,意味着其后面没有更多的字节了,如果将字节的第0bit 设为1意味着在着该多字节整数由多个字节构成。接下来是高度,高度是图象的垂直尺寸,同样使用多字节格式表示。剩余部分就是图像数据了,每一个bit对应一个象素,1为白0为黑。

以下是手机上wbmp解码的一个例子:

u8 WBMPDecodeOneByte(u16 *p,u8 oneByte)

{

u8 i,mask;

mask = 0x80;

for(i = 0;i<8;i++){

if(oneByte&mask)

*(p+i) = 0xffff;

else *(p+i) = 0x0000;

mask >>= 1;

}

return 1;

}

u8 WBMPGetWorH(u8 *p,u16 *worh)

{

u8 ret = 0;

*worh = 0;

for(;;){

if(*p&0x01){

*worh |= (*p&0xfe);

ret++;

p++;

}else{

*worh |= (*p);

ret++;

break;

}

}

return ret;

}

u32 WBMPDecoder( u8 *indata,u8 *outdata)

{

u16 i,j,width,height;

u16 *p;

u8 *cp;

if(indata[WBMP_TYPE_FIELD_BYTE_NB/*0*/]!=0)return 1;

if(indata[WBMP_FIXHEADER_FIELD_BYTE_NB/*1*/]!=0)return 2;

cp = indata+2;

cp +=WBMPGetWorH(cp,&width);

cp +=WBMPGetWorH(cp,&height);

if(outdata == 0){

return (width*height*2+8);

}

p = (u16*)outdata+4;

for(i = 0,j = 0;i<width*height;i+=8,j++){

WBMPDecodeOneByte(p,cp[j]);

p += 8;

}

p = (u16*)outdata;

*(p+0) = width;

*(p+1) = height;

*(p+2) = 0x0010;

*(p+3) = 0x0000;

return 0;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有