在BREW中使用压缩后的图片资源,付真机测试过的代码

原创 2004年08月16日 11:25:00
大家一定为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来解压,代码如下:
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)

H.264/AVC视频编解码技术详解

-
  • 1970年01月01日 08:00

webpack 压缩图片

安装 image-webpack-loader  然后webapck配置里  { test: /\.(png|jpg|gif)$/i, exclude: /(node_modules|bow...
  • txl910514
  • txl910514
  • 2017-07-26 10:38:40
  • 1659

在BREW中使用压缩后的图片资源,付真机测试过的代码

大家一定为BMP图片占用太多存储空间这个问题很苦恼吧,做简单的小游戏,图片资源也得占个几十上百K,不要告诉我要用PNG,用这个东西限制太大了,也不要老想着PNG TO BMP,我想过移植,看看PNG的...
  • celitezheng
  • celitezheng
  • 2004-08-16 11:25:00
  • 863

mac 压缩png图片资源 pngcrush命令

iOS应用是,xcode会对PNG文件进行优化,这样图片预览就无法显示。那么如何查看这些经过优化的文件呢?   优化的动作是由pngcrush 工具完成的,你可以再xcode中找到。pngcru...
  • dztianyu
  • dztianyu
  • 2013-11-21 14:03:17
  • 2349

brew数据压缩的实现

最近在做手机RPG游戏,涉及到的数据文件和图片文件非常多,于是进行压缩解压缩。做下笔记摘要。很多部分参考了前人的笔记,感谢前人给了肩膀站站 :]  一、主体思路:1、将目标文件按GZIP格式压缩成压缩...
  • yuyueliuliu
  • yuyueliuliu
  • 2009-09-23 14:16:00
  • 1185

Luban—— Android图片压缩工具

图片压缩方法学习http://blog.csdn.net/zhangli_/article/details/52105916
  • mingtiannihao623
  • mingtiannihao623
  • 2018-03-11 20:33:21
  • 16

mac下快速生成@2x和压缩图片

iOS开发中,因为有普通屏和高清屏的原因,所以需要在应用中放置两套图,一套是for普通屏的,一套是for高清屏的。for高清屏的命名方式:***@2x.png。使用的时候只要使用for普通屏的图片,在...
  • openglnewbee
  • openglnewbee
  • 2013-12-10 10:43:48
  • 4985

python&tinypng压缩图片

import tinify tinify.key = &quot;h0ErL5tzh-FPrA1Oq6J4Vaoh6jhYPI4_&quot; def compress(filename): ...
  • themagickeyjianan
  • themagickeyjianan
  • 2016-08-02 01:22:23
  • 1773

Google开源JPEG压缩算法--Guetzli体验

Google最近开源了一种新的JPEG图片的压缩算法,称使用 Guetzli 压缩的 JPEG 图像文件比使用现有的方法小 35%。由于项目最近正在研究图片的后期处理功能,所以马上体验了一下。环境介绍...
  • zjjnwpu
  • zjjnwpu
  • 2017-03-23 18:05:37
  • 1963

手机网页版JS压缩上传图片--base64位 兼容IOS和安卓

首先,我用到了一款插件,是纯JS压缩上传插件,第一次用CSDN,不太会用,所以我把插件所有代码拷贝在文章末尾。 最基本,加载JS插件script src="__JS__/dist/lrz.mobile...
  • MrXuMinWei
  • MrXuMinWei
  • 2016-05-31 13:34:07
  • 6308
收藏助手
不良信息举报
您举报文章:在BREW中使用压缩后的图片资源,付真机测试过的代码
举报原因:
原因补充:

(最多只允许输入30个字)