分享
 
 
 

BREW中使用经GZIP压缩的BMP图片,付真机测试过的代码

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

BREW中使用经GZIP压缩的BMP图片,付真机测试过的代码

winger

大家一定为BMP图片占用太多存储空间这个问题很苦恼吧,做简单的小游戏,图片资源也得占个几十上百K,不要告诉我要用PNG,用这个东西限制太大了,也不要老想着PNG TO BMP,我想过移植,看看PNG的解压代码,我就头疼。

其实,大家仔细翻翻帮助,就会发现2。0以上的SDK都支持一个AEECLSID_UNZIPSTREAM的解压对象,这个对象是针对GZIP压缩的数据解压的。

OK,想到我的解决方法了吧:使用GZIP压缩BMP,然后用AEECLSID_UNZIPSTREAM来解压。

我的解决方案大概以下几步:

1、GZIP压缩BMP,一定要是GZIP,WINZIP,WINRAR都不可以

2、把压缩后的BMP加进资源里,方法是,把压缩后的文件改成 .bmp 的后缀,作为图片资源加进去

3、在程序里用AEECLSID_UNZIPSTREAM来解压,代码如下:

PHP源码:

void * unzipbmpex(MJ * mj, char *res_file, uint16 id, int *w, int *h)

{

uint32 nTmp, size, l;

byte *buf, *tmpbuf;

void * pbmSource = NULL;

byte *pDataBytes;

void *bmp;

AEEImageInfo imageInfo;

boolean bVal = TRUE;

if(NULL == (pbmSource=ISHELL_LoadResDataEx (mj->a.m_pIShell, res_file,

id, RESTYPE_IMAGE, NULL, &size)))

{

return NULL;

}

tmpbuf= (byte *)MALLOC(size-*((byte *)(pbmSource)));

MEMCPY(tmpbuf,(byte *)pbmSource+*((byte *)(pbmSource)),size-*((byte *)(pbmSource)));

IMEMASTREAM_Set(mj->pMemStream, tmpbuf, size-*((byte *)(pbmSource)), 0, FALSE);

l = (*((byte *)pbmSource+size-4))

+((*((byte *)pbmSource+size-3))<<8)

+((*((byte *)pbmSource+size-2))<<16)

+((*((byte *)pbmSource+size-1))<<24);

ISHELL_FreeResData (mj->a.m_pIShell, pbmSource);

buf= (byte *)MALLOC(l);

IUNZIPASTREAM_SetStream(mj->pIUnzipAStream, (IAStream *)mj->pMemStream);

nTmp = IUNZIPASTREAM_Read(mj->pIUnzipAStream, (void*)buf, l);

if(nTmp>0)

{

while(nTmp<l)

{

nTmp = IUNZIPASTREAM_Read(mj->pIUnzipAStream, (void*)(byte *)(buf+nTmp), l-nTmp)+nTmp;

}

pDataBytes = (byte *)(buf);

bmp = CONVERTBMP (pDataBytes, &imageInfo, &bVal);

*w = imageInfo.cx;

*h = imageInfo.cy;

FREE(buf);

return bmp;

}

else if((nTmp == AEE_STREAM_WOULDBLOCK)||(nTmp == 0))

{

FREE(buf);

return NULL;

}

return NULL;

}

由于很晚了,有些细节就靠大家自己补齐了。

当然了,大的数据文件也可以这样用(包括MIDI,WAV等),不过注意,加进资源里也要是设成图片类型,文件的后缀也要是.bmp。下面是解数据文件的代码:

void *unzipex(MJ * mj, char *res_file, uint16 id, uint32 *xsize)

{

uint32 nTmp, size, l;

byte *buf, *tmpbuf;

void * pbmSource = NULL;

byte *pDataBytes;

boolean bVal = TRUE;

if(NULL == (pbmSource=ISHELL_LoadResDataEx (mj->a.m_pIShell, res_file,

id, RESTYPE_IMAGE, NULL, &size)))

{

return NULL;

}

tmpbuf= (byte *)MALLOC(size-*((byte *)(pbmSource)));

MEMCPY(tmpbuf,(byte *)pbmSource+*((byte *)(pbmSource)),size-*((byte *)(pbmSource)));

IMEMASTREAM_Set(mj->pMemStream, tmpbuf, size-*((byte *)(pbmSource)), 0, FALSE);

l = (*((byte *)pbmSource+size-4))

+((*((byte *)pbmSource+size-3))<<8)

+((*((byte *)pbmSource+size-2))<<16)

+((*((byte *)pbmSource+size-1))<<24);

ISHELL_FreeResData (mj->a.m_pIShell, pbmSource);

buf= (byte *)MALLOC(l);

IUNZIPASTREAM_SetStream(mj->pIUnzipAStream, (IAStream *)mj->pMemStream);

nTmp = IUNZIPASTREAM_Read(mj->pIUnzipAStream, (void*)buf, l);

if(nTmp>0)

{

//*xsize = nTmp;

while(nTmp<l)

{

nTmp = IUNZIPASTREAM_Read(mj->pIUnzipAStream, (void*)(byte *)(buf+nTmp), l-nTmp)+nTmp;

}

*xsize = l>nTmp?nTmp:l;

pDataBytes = (byte *)(buf);

return buf;

}

else if((nTmp == AEE_STREAM_WOULDBLOCK)||(nTmp == 0))

{

FREE(buf);

return NULL;

}

return NULL;

}

这两个函数我在真机6260等多个型号上测试过,速度不错,没有慢的感觉。GZIP的压缩率接近PNG,因为PNG的压缩算法也和GZIP差不多。

GZIP嘛,大家用GOOGLE搜索可以找到,如果装了CYGWIN,直接用里面的就可以了(没有想到要找GZIP。EXE之前,我一直傻乎乎的用CYGWIN里的GZIP)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有