The Image Module
The Image module provides
- a class with the same name which is used to represent a PIL image.
- The module also provides a number of factory functions(including functions to load images from files, and to create new images)
图像对象 Image – from file or newly created
所有的图片操作必须有一个操作对象,例如Pil提供open(filename)进行这个过程,此后,一切关于图片的操作均基于这个对象。有以下几种创建image对象的方式:
1 Image.open(f)
>>> import Image
>>>
>>> Im = Image.open("lena.jpg")
>>> print Im.mode,Im.size,Im.format
RGB (256, 256) JPEG
>>> Im.show()
如果文件不能打开,会抛出IOError异常。
可以查看image对象的format,mode,size,palette,info几个属性。
调用im.show()会在图片查看工具中显示当前操作的image对象。
标准版本的show方法的实现不太高效,因为它先把image保存到一个临时文件,然后调用xy工具来显示图像。如果你没有安装xy,那么它就无法工作了。不过如果它可以工作,倒还是非常方便用来debug和测试。
2 Image.new(mode,size,color=None)
color的默认值是黑色,这里我们新建一个红色的图像。
>>> newIm = Image.new (“RGBA”, (640, 480), (255, 0, 0)) #新建一个image对象creating images from scratch
3 Image.blend(i1,i2,a) -- (p1 x (1 - a) + p2 x a)
选一张灰度图(L)做背景,和雷娜图(RGB)做blend操作
>>> Im2 = Image.open("background.jpg").convert(Im.mode)
>>> Im2 = Im2.resize(Im.size)
>>> Im2.show()
>>>
>>> img = Image.blend(Im,Im2,0.2)
>>> img.show()
操作完毕后save(filename)用以保存这个临时的image对象img到硬盘。
4 Image.composite(i1,i2,mask) --equal-sized images i1 ,i2 and mask("1", "L", or "RGBA") (p1 x (1 - m) + p2 x m)
5 Image.eval(f,i) -- applying a function f to each pixel of image i
6 Image.merge(mode,bandList) --Creates a multi-band image from a sequence of single-band images of equal size
以下是Image对象的全部方法:
save(f,format=None) | 保存 | 如果f是一个file对象,必须指定format(format codes) |
convert(mode) | 转换mode | |
copy() | ||
crop(bbox) | 剪切 | 原图中bbox区域 |
filter(name) | 滤镜 | the name of predefined image enhancement filters 滤镜名字需要import ImageFilter |
getbands() | 通道的字符串序列 | 如RGB图返回('R', 'G', 'B') |
getbbox() | 包含非零区域的最小bbox | |
getextrema() | 最大最小像素点值 | min&max pixel value 单通道图:返回元组(min,max) 多通道图:返回各个通道的元组组成的元组 |
getpixel(xy) | 取像素点值 | 坐标xy处的pixel value or a sequence of pixel values |
histogram(mask=None) | 统计直方图 | 单通道图:返回列表[c0, c1, ...],ci是值为i的像素数 多通道图:a single sequence that is the concatenation of the sequences for all bands mask参数:a same-sized mask image of mode "1" or "L"(include only those pixels correspond to nonzero pixels in the mask argument) |
offset(dx,dy=None) | 平移 | Returns a new image the same size as the original, but with all pixels rotated dx in the +x direction,and dy in the +y direction. If dy is omitted, it defaults to the same value as dx. |
paste(i2,where,mask=None) | 粘贴图片 | where参数可以是 1 (x,y)坐标对:i2的像素点(0,0)对齐原图中的(x,y)粘贴,i2超过原图边界的部分被抛弃 2 bbox:i2必须和该bounding box大小一致 3 None:i2必须和原图大小一致 如果i2的mode和原图不一致,粘贴前会被转换。 mask参数:a same-sized mask image of mode "1","L" or “RGBA ”(control which pixels get replaced) |
paste(color,box=None,mask=None) | 填充颜色 | 如果box省略,整个图被填充为color色;mask参数同上 |
point(function) | 改变像素点(函数) | Returns a new image with each pixel modified. |
point(table) | 改变像素点(查表) | To translate pixels using a table(a sequence of 256n values, where n is the number of bands in the image) lookup |
putalpha(band) | 改变alpha通道 | The pixels of the band image(same-sized,"L" or "1") replace the alpha band(A) of the original image(RGBA) in place. |
putpixel(xy, color) | 改变单个像素点颜色 | Note that this method is relatively slow. For more extensive changes, use paste or theImageDraw module instead. |
resize(size,filter=None) | 调整大小 | |
rotate(theta) | 旋转(围绕图片中心) |
Any pixels that are not covered by rotation of the original image are set to black. |
show() | 显示图片 | On Unix systems, this method runs the xv image viewer to display the image. |
split() | 分离通道 | 返回各个通道的灰度图组成的元组 |
thumbnail(size,filter=None) | 缩略图 | Modifies in-place,Preserves aspect ratio |
transform(xs, ys, Image.EXTENT, (x0,y0,x1,y1)) | Returns a transformed copy of the image. In the transformed image, the point originally at (x0,y0) will appear at (0,0), and point (x1,y1) will appear at (xs, ys). | |
transform(xs, ys, Image.AFFINE, (a,b,c,d,e,f)) | affine变换 | The values a through f are the first two rows of an affine transform matrix. |
transpose(method) | 翻转旋转 | ROTATE_90/180/270(clockwise), FLIP_TOP_BOTTOM(horizontal), FLIP_RIGHT_LEFT(vertical) |
The ImageDraw Module
支持2D图像 The ImageDraw module provide basic 2D graphics support for Image objects.
It can for example be used to
- create new images,
- annotate or retouch existing images, and to generate graphics on the fly for web use.
For a more advanced drawing library for PIL, see The aggdraw Module.
创建绘画对象 ImageDraw module creates drawing surface for image
import Image, ImageDraw
im = Image.open(“vacation.jpeg")
drawSurface = ImageDraw.Draw(im)
基本绘画操作 Basic methods of drawing surface
- 弧/弦/扇形 chord arc pieslice (bbox, strtAng, endAng)
- 椭圆 ellipse (bbox)
- 线段/多段线 line (L) draw.line(((60,60),(90,60), (90,90), (60,90), (60,60))) #draw a square
- 点 point (xy) #单像素点很小看不清,实际中可用实心小圆代替
- 多边形 polygon (L) draw.polygon([(60,60), (90,60), (90,90), (60,90)]) #draw a square
- 矩形 rectangle (bbox) # first coord属于矩形, second coord不属于
- 文字 text(xy,message,font=None) 绘制文字message,文本区域左上角坐标为xy
drawable.text((10, 10), "Hello", fill=(255,0,0), font=None) - 文字大小 textsize(message,font=None) 给定文字message,返回所占像素(width,height)
可选参数 Common optional args for these methods
- fill=fillColor
- outline=outlineColor
矢量字体支持 TrueType Font support
import ImageFont
ttFont = ImageFont.truetype (“arial.ttf”, 16)
drawable.text ((10, 10), “Hello”, fill=(255,0,0), font=ttFont)
例子:Draw a Grey Cross Over an Image
import Image, ImageDraw im = Image.open("lena.pgm") # Creates an object that can be used to draw in the given image. draw = ImageDraw.Draw(im) # draw.line(xy, options) => Draws a line between the coordinates in the xy list. # The coordinate list can be any sequence object containing either 2-tuples [ (x, y), ... ] # or numeric values [ x, y, ... ]. # The fill option gives the color to use for the line. draw.line((0, 0) + im.size, fill=128) draw.line((0, im.size[1], im.size[0], 0), fill=128) del draw # write to stdout im.save(sys.stdout, "PNG")