Oh!Coder

Coding Life

ChunkyPNG Gem 简介

| Comments

这次介绍一个处理png图片文件的gem,名字叫Chunky PNG

基本简介

这个gem使用纯净的Ruby写成,不依赖于RMagick或其他任何内存泄漏的图形库。

功能特点

  • 可以解码任何PNG标准的图片。这里面包括所有标准的颜色模式,所有深度和透明bit位,扫描和过滤操作。

  • 编码所有图片支持的颜色模式(包括真彩色,灰度图和索引),以及所有颜色模式对应的透明度。基于所使用的颜色总量,自动选择最好的颜色模式。

  • 读/写图形的像素。

  • 读/写所有存储在图形块中的元数据。

  • 内存影响(使用Fixnum类型,比如每像素4或8字节的内存占用,这取决于硬件)

  • 采用标准Ruby标准,速度相当快,通过使用整型运算来进行高度优化。

  • 如果需要,可以和RMagick进行交互。

当然了,也可以参考使用OilyPNG。OilyPNG用C语言实现了ChunkyPNG的最简功能模块,提供了快速编码和解码的方法。

基本使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
require 'chunky_png'

# Creating an image from scratch, save as an interlaced PNG
png = ChunkyPNG::Image.new(16, 16, ChunkyPNG::Color::TRANSPARENT)
png[1,1] = ChunkyPNG::Color.rgba(10, 20, 30, 128)
png[2,1] = ChunkyPNG::Color('black @ 0.5')
png.save('filename.png', :interlace => true)

# Compose images using alpha blending.
avatar = ChunkyPNG::Image.from_file('avatar.png')
badge  = ChunkyPNG::Image.from_file('no_ie_badge.png')
avatar.compose!(badge, 10, 10)
avatar.save('composited.png', :fast_rgba) # Force the fast saving routine.

# Accessing metadata
image = ChunkyPNG::Image.from_file('with_metadata.png')
puts image.metadata['Title']
image.metadata['Author'] = 'Willem van Bergen'
image.save('with_metadata.png') # Overwrite file

# Low level access to PNG chunks
png_stream = ChunkyPNG::Datastream.from_file('filename.png')
png_stream.each_chunk { |chunk| p chunk.type }

上面是一些基本的使用方法。ChunkyPNG主页有一个John Davison的视频讲解教程,介绍了ChunkyPNG类库的基本使用方法。

使用安全警告

ChunkyPNG是一个脆弱的解压炸弹,这意味着ChunkyPNG很容易在加载PNG文件时,因为受到DOS攻击而产生内存溢出。因为类库使用的是纯净的Ruby写成,所以其自身很难修正这个问题。

为了安全的处理不信任图片,需要确保让ChunkyPNG运行在一个隔离的进程中,比如fork一个新进程或使用一个后台进程处理。

Comments