上回我SHARE了一个将PNG转成BMP的方法,通过直接向Buffer里Draw一个PNG来实现的,今天我想共享给大家的是用自己解码来实现PNG转成BMP的方法,这个方法更正统,不过实现也相对比较麻烦一点.
PNG 的格式除了几个头以外,关键是它的数据用GZip做了压缩,所以,要实现PNG的解码,需要先了解的背景知识只有两个:1.PNG/BMP的编码格式, 2.GZIP的编码格式.这两种文档的编码格式,可以Google一下,会有很多相关资料,我就不再罗嗦了.把自己的实现说一下吧.
1.解开GZIP的方法,我用拿来主义,将网上流传的一个KJava的代码翻译了一下,改写成C代码就OK了.源文件可以点击这里.
在翻译的过程中,注意一下java与c的语法,大体上就可以了,并没有太大难度,好象就是将byte的数组换成byte的指针,记得malloc就一定要free.
2.解析PNG也不复杂,大家可以参考这个文档(中 文的,也说的比较清楚).从头里可以得到一些信息(我因为实用的原因,只处理特定的格式,8bit索引).然后,拿到数据,解压缩得以像素值,就可以构造 出一个IDIB结构.我们知道IDIB是BREW中唯一能直接操作像素点的接口(如果想手工操作BMP的像素,它是一个很方便的途径).部分代码如下:
booleanPngDecoder_ToBMP(PngDecoder*pMe,byte*pPngRaw,IDIB*pDIB)
{
byte*block;
byte*data;
inti,j,index;
uint32len;
Headhead;
if(pPngRaw[0]!=0x89||pPngRaw[1]!=0x50||pPngRaw[2]!=0x4E||pPngRaw[3]!=0x47||pPngRaw[4]!=0x0D||pPngRaw[5]!=0x0A)
returnFALSE;
//缺省认为都是0x08(8bitscolordepth)0x03(调色板)
IDIB_FlushPalette(pDIB);
pDIB->pPaletteMap=NULL;
pDIB->nDepth=8;
pDIB->nColorScheme=0;
pDIB->nPitch=pDIB->cx;
pDIB->ncTransparent=IBITMAP_RGBToNative(pMe->pScreen,MAKE_RGB(255,255,255));
//调色板
index=33;
readHead(pPngRaw+index,&head);
if(STRCMP(head.type,"PLTE")==0)
{
len=head.len;
index+=8;
pDIB->pRGB=(uint32*)MALLOC(sizeof(uint32)*(len/3));
MEMSET(pDIB->pRGB,0,(len/3)*sizeof(uint32));
for(j=0,i=index;i<index+len;j++,i+=3)
{
//低位
pDIB->pRGB[j]=((uint32)pPngRaw[i]<<16)+((uint32)pPngRaw[i+1]<<8)+(uint32)pPngRaw[i+2];
}
pDIB->cntRGB=j;
index+=len+4;
}
//读透明色
readHead(pPngRaw+index,&head);
if(STRCMP(head.type,"tRNS")==0)
{
len=head.len;
index+=8;
j=(int)pPngRaw[index];
pDIB->ncTransparent=IBITMAP_RGBToNative(pMe->pScreen,(RGBVAL)pDIB->pRGB[j]);
index+=len+4;
}
//Step2:读数据放入block里
//数据长
readHead(pPngRaw+index,&head);
if(STRCMP(head.type,"IDAT")==0)
{
len=head.len;
block=(byte*)MALLOC(len);
index+=10;//IDAT块前面两个字节是标志:0x780x5E
MEMSET(block,0,len);
MEMCPY(block,&pPngRaw[index],len);
//Step3:解压缩
data=GZIP_Inflate(pMe->gzip,block,pDIB->cx*pDIB->cy+pDIB->cy);
len=pMe->gzip->uncompressed_index;
pDIB->pBmp=(byte*)MALLOC(pDIB->cx*pDIB->cy);
for(i=0;i<pDIB->cy;i++)
for(j=0;j<pDIB->cx;j++)
{
pDIB->pBmp[i*pDIB->cx+j]=data[i*(pDIB->cx+1)+j+1];
}
FREEIF(block);
block=NULL;
FREEIF(data);
data=NULL;
}
returnTRUE;
}
pPngRaw是加载的PNG图像数据,可以来自于文件或网络,转换的结果放到pDIB里.
分享到:
相关推荐
接下来,我们需要将解码后的像素数据转换成BMP格式。这包括创建BMP文件头,它包含文件大小、位图信息头、位图宽度、高度、色彩位数等信息。BMP格式的像素数据存储方式与PNG不同,通常需要对行数据进行填充,以确保每...
在这个场景中,"BREW保存当前屏幕到bmp"是指使用BREW API来捕获设备的当前屏幕内容,并将其保存为一个位图(Bitmap,简称bmp)文件。 位图文件格式(BMP)是一种常见的图像文件格式,它存储的是像素数据,支持真...
将ppt转换为图像(png,jpg)。 如果要将PowerPoint文件转换为png或jpg图像,则可以使用此脚本来完成。 要求 该软件包需要安装以下软件: LibreOffice开发 图像魔术 pdf信息 安装 最低节点版本: 14 `npm ...
将PPT(PowerPoint演示文稿)转换成HTML文件是一种实用的方法,因为HTML格式支持在网页浏览器中直接打开,无需特定的应用程序。下面,我们将详细讨论这个过程,包括涉及到的工具、库以及转换的具体步骤。 首先,...
【BREW教程(深入BREW开发)】 BREW,全称Binary Runtime Environment for Wireless,是一种专为移动设备设计的操作系统和应用程序开发平台。这份教程深入解析了BREW的实现原理和相关机制,旨在帮助开发者更深入地...
在实际案例部分,书中将通过一系列示例来展示如何解决常见的brew使用问题,如处理依赖冲突、更新过时的软件包、以及优化系统资源的使用。这些实战经验将帮助读者更好地应对实际工作中遇到的各种挑战。 总而言之,...
### BREW MP架构与编程模型概述 #### 一、课程目标 本课程旨在为参与者提供以下方面的知识: 1. **了解BREW MP™**:掌握BREW MP的基本概念及其在移动应用开发领域的地位。 2. **理解BREW MP的高级架构**:深入探讨...
应用灌入手机方法-使用BREW工具 本文主要讲解了使用BREW工具将应用灌入手机的操作方法,旨在协助用户在营业厅完成手机升级工作。下面将对标题、描述、标签和部分内容进行详细的解释和分析。 标题:应用灌入手机...
# 使用方法: # 1. 直接指定rb文件安装: brew install icu4c@73.rb # 2. 将icu4c@73.rb文件放到brew的默认Formula路径 然后执行 brew install icu4c@73 # 路径:/usr/local/Homebrew/Library/Taps/homebrew/homebrew...
《深度剖析BREW实现原理》一书是针对BREW(Binary Runtime Environment for Wireless)平台的一份详尽解析,旨在帮助开发者深入理解BREW的代码结构、编程基础以及底层工作原理。BREW是由高通公司(Qualcomm)开发的...
4. BMC_Convertor.exe:这个文件可能是数据或文件转换工具,用于将不同格式的数据或应用程序适配到Brew平台,以确保它们能在目标设备上正常运行。 5. lng、images、docs、scripts:这些文件夹分别包含了语言文件、...
第8章 BREW 3.1 SMS新接口使用方法 第9章 BREW 语音呼叫业务 第10章 BREW 3.1.5 SP01 触摸屏功能使用 第11章 IThread及IRscPool接口使用 第12章 BREW 面向对象特点及其应用 第13章 基于socket的网络编程 第14章 ...
3. **解码**:一旦位图文件被读取,解码器会将文件数据转换成内存中的像素数组,以便IImage接口能够理解和处理。 4. **内存管理**:为了优化性能,位图数据可能会被缓存或预加载到内存中。这有助于减少后续访问相同...
在开发Brew Mobile Platform (BMP) 应用时,调试是必不可少的步骤,而断点调试是其中的关键环节。然而,在使用Visual Studio (VS) 进行BMP应用的模拟器调试时,可能会遇到一个常见问题:设置的断点无法正常工作,...
Brew(全称为Berkeley Packet Filter)是一种轻量级的软件开发工具包(SDK),主要用于在嵌入式设备上创建和管理应用程序。BrewSDK(Brew Software Development Kit)是这个平台的核心组成部分,它提供了开发、编译...
《brew3.0 API + 深入brew开发》这套资料是针对计算机软件开发者和系统管理员的宝贵资源,尤其对于那些在Unix-like操作系统(如macOS)上进行软件管理和自动化安装的用户。Brew,全称Homebrew,是这类系统中最流行的...
brew widget开发资料,来自qualcomm的BMP,非常不错,电子书哦,很漂亮
NodeJS BMP 到 Vector EPS(适用于 Mac OSX) ####Problem 我需要将各种不同的作曲家图像转换为矢量图形。 图像需要具有任何形状和风格,最终我需要通过 Adobe Illustrator 处理它们。 ####Solution 使用 Mac ...