RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:9:30-18:00
你可能遇到了下面的问题
关闭右侧工具栏
在BREW中使用压缩后的图片资源,付真机测试过的
  • 作者:xiaoxiao
  • 发表时间:2020-12-23 10:36
  • 来源:未知

大家一定为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)