PNG图像压缩研究

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

S tudy on P NG Ima ge Compre s s ion
PIAO Hong- ji , SUN Yu- zhe

(Institute of University Students'Innovation, Dalian University of Technology, Dalian 116023)
4.3 本文算法与其他算法的比较
表 6 本文算法与其他算法对 PNG 图像的压缩率比较
由实验数据可见, 本文算法对 PNG 图像的压缩 率略优于 Pngout 软件。
5 结语
本文提出了一种 PNG 文件压缩算法, 算法利用 PNG 文件格式的特点, 对 PNG 文件进行了优化, 并通 过 打 包 成 .aim 文 件 的 方 法 实 现 了 对 PNG 文 件 的 压 缩, 较好地减小了 PNG 图像在.jar 包中的大小。算法 简单易于实现, 使用时可以根据需要随时对.aim 的格 式进行调整, 灵活性强, 并有较好的压缩比。


Abs tract: According to the characteristic of PNG format image, proposes an algorithm of PNG image

compression. The algorithm joins all PNG images to a .aim format file and compresses them.
表 1 PNG 文件数据块结构
数据块) 等。但并不是每个数据块都是必须的。一个 PNG 格 式 文 件 应 至 少 包 含 IHDR、PLTE、IDAT、IEND 这 4 个数据块, 可以根据具体需要添加其他数据块。
2 压缩 P NG 图像的方法
2.1 通过删除多余数据块压缩 PNG 图像 由于用 PhotoShop、ACDSee 等图像编辑软件生产
图形图像
P NG图像压缩研究
朴红吉 , 孙宇哲
(大连理工大学大学生创新院, 大连 116023)
摘 要: 针对 PNG 文件格式的特点, 提出了一种压缩 PNG 图像的算法。算法将所有图像处理后 打包 成.aim 文件 , 特 点 是简 单 易 于实 现 , 在 使用 时.aim 文 件的 格 式 灵活 多 变 , 保密 性 强 。 实验表明, 在保证 PNG 图像质量不受影响的前提下, 将 PNG 图像在 jar 包中的大小减小 了 14.59%, 从 J2ME 程序读取 PNG 的速度也优于J2ME 提供 Image.creatImage( )的方法。

Experiment shows, PNG images are 14.59% smaller in the .jar file without reducing the
(总
PNG images'qualities, the extract speed in J2ME program is faster than the Image.creatIm-
取 PNG 图像偏移 pngLengths [i] = dis.readInt ( ); //读 取
PNG 图像长度 } if (dis.available( > 0) { System.out.println("[ERROR] in begin
( )"); } dis.close( ); ready = true;
MO D E R N C OMP U T E R 2007.5
现 代 计 算 机 (总 第 二 五 九 期 )
!"
图形图像
由 实 验 结 果 可 知 , 图 像 在.jar 包 减 小 了 14.59%, 同 时 PNG 图像的质量没有受到任何影响。 4.2 PNG 图像提取
用程序导入 98 张 PNG 图像的统计如下表所示:
0; i++) { int index = contains (pngNames [i],
name); if (index < 0) { } else { count- - ; int skip = dis.available ( ) - aiБайду номын сангаас-
Length + pngExcursions [i];//从 当 前 位 置 到 指 定 图 像 位 置 需 跳过的字节数
表 2 打包文件( .aim) 的格式设计


计 1.3 关键数据块

一个 PNG 文件可以 包 含 许 多 数 据 块 , 如 IHDR
机 ( 文件头数据 块 ) 、IDAT( 图 像 数 据 块)、gAMA( 图 像 γ
(总 数 据 块 ) 、tEXt( 文 本 信 息 数 据 块 ) 、hIST( 图 像 直 方 图
static short pngNr = 0; //PNG 图像数量 static String[] pngNames = null; //PNG 图像名称 static int[] pngExcursions = null; //PNG 图像偏移 static int[] pngLengths = null; //PNG 图像长度 static boolean ready = false; //是否准备好提取图像 public static void begin(DataInputStream dis) {
关键词: PNG; 压缩; J2ME; .aim
0 引言
对 J2ME 手机游戏中必需的 PNG 文件的压缩作 研究, 给出了一种针对 PNG 文件的压缩方法, 并对一 款手机游戏中的 PNG 图像进行了实验, 将 PNG 图像 在 jar 包中的大小减小了 14.59%, 从 J2ME 程序读取 PNG 的速度也优于 J2ME 提供 Image.creatImage()的方 法, 达到了预期目的。
} catch (Exception e) { e.printStackTrace( );
} } public static Image [] creatImages (DataInputStream dis,
String[] name) { if (! ready) { System.out.println("ImageY is not ready! "); } Image[] imgs = new Image[name.length]; int count = name.length; try { int aimLength = dis.available(); dis.skip(4); for (int i = 0; i < pngNames.length && count >
try { int skip = dis.readInt(); dis.skip(skip); //跳到.aim 头文件 pngNr = dis.readShort(); //读取 PNG 图像数量 pngNames = new String[pngNr]; pngExcursions = new int[pngNr]; pngLengths = new int[pngNr]; for (int i = 0; i < pngNr; i++) { byte nameLength = dis.readByte( ); byte[] name = new byte[nameLength]; dis.read(name); //读取 PNG 图像名称 pngNames[i] = new String(name); pngExcursions [i] = dis.readInt ( ); //读


五 九 收稿日期: 2007- 03- 20 修稿日期: 2007- 05- 13 期 作者简介: 朴红吉( 1985- ) , 男, 吉林磐石人, 本科, 研究方向为信息隐藏

!" MO D E R N C OMP U T E R 2007.5
图形图像
3 P NG文件的提取
PNG 文件的提取过程为: 将指定要提取的 PNG 图像的文件名, 与从.aim 头文件开始存储的 PNG 文 件名逐个比较, 直到找到指定文件, 并读出该文件的 偏移量和长度, 提取并解密该 PNG 图像文件, 补上 PNG 文件的签名域。这样就实现了 PNG 文件的提取。
的 PNG 图像会包含许多数据块, 其中可能包含一些 不必要的数据块。根据具体需要, 可以将不必要的数 据块删除, 以达到压缩 PNG 图像的目的。PNG 图像的 签名域是固定不变的, 因此也可以删除此签名域, 而 在提取程序中添加。 2.2 通过打包多个 PNG 图像以达到压缩的目的
将多个 PNG 打包成一个文件可以很好地起到减 少文件大小的目的。为了能够在 J2ME 程序中方便地 提取出 PNG 图像, 必须设计适当的打包文件( .aim) 格 式。
4 实验及结果
实 验 环 境 : Windows XP、Photoshop CS、Java
1.5.0- b64、Java Wireless Toolkit 2.5 for CLDC Beta。
4.1 压缩率实验及结果
本文以某手机游戏的 PNG 图像为实验材料进行
实验, 得到以下实验结果: 表 3 压缩率实验结果
参考文献 [1]罗尉源. 手机游戏前景光明. http://home.donews.com/
donews/article/9/92732.html, 2006.03.10 [2]李章晶, 郑国勤. 针对无线通信领域的图像压缩的研究.
计算机工程与设计, 2006, 27(23): 4471 ̄4474 [3]W3C. Portable Network Graphics (PNG) Specification
byte [] data = pickUpASpecificIm- age(dis, skip, i); //提取指定 PNG 图像
imgs [index] = Image.createImage (data, 0, data.length);
} } dis.close(); } catch (Exception e) { e.printStackTrace( ); } return imgs; }
(Second Edition). Information Technology- Computer Graphics and Image Processing- Portable Network Graphics (PNG): Functional Specification. ISO/IEC, 15948:2003(E).
表 4 用程序导入 PNG 图像统计( 1)
表 5 用程序导入 PNG 图像统计( 2)
由实验统计数据可知: 本文算法导入一张 PNG 图像所需时间大于 J2ME 提供算法所需时间, 并且随 着导入 PNG 图像数量的增加效率明显降低; 但若一 次导入多张图像, 本文算法所需时间小于是 J2ME 提 供算法所需时间, 并且随着导入 PNG 图像数量的增 加效率略有提高。可见本文算法在一次性导入多张 PNG图像时有更好的表现。
1 P NG 图像格式
1.1 PNG 文件签名域 PNG 文件的签名域由 8 个字节组成, 用来标识
该 文 件 是 否 是 PNG 文 件 。 该 签 名 域 的 值 是 : 0x89、 0x50、0x4E、0x47、0x0D、0x0A、0x1A、0x0A。 1.2 PNG 文件数据块的结构
PNG文件数据块的结构[3]如表 1 所示:
这个过程主要的 J2ME 源代码如下:
final static String[] RESERVED = new String[] {"IHDR", "PLTE", "IDAT", "IEND", "tRNS"}; //本 例 中 保 留 的 png 数 据块
final static byte[] PNG_SIGN = new byte[] { (byte) 0x89, (byte) 0x50, (byte) 0x4E, (byte) 0x47, (byte) 0x0D, (byte) 0x0A, (byte) 0x1A, (byte) 0x0A}; //png 图像的签名域
相关文档
最新文档