Chinaunix首页 | 论坛 | 博客
  • 博客访问: 114084
  • 博文数量: 26
  • 博客积分: 1726
  • 博客等级: 上尉
  • 技术积分: 435
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-11 14:24
文章分类

全部博文(26)

文章存档

2013年(2)

2011年(2)

2010年(15)

2008年(7)

我的朋友

分类: Python/Ruby

2010-05-30 11:53:44

剪切,粘贴与合并图像
    Image类所包含的方法可以让你对图像的某个区域进行操作。取到图像的一个子区,可以使用crop方法。
    Example: 从图像中复制一小框

box = (100, 100, 400, 400)
region = im.crop(box)

    这个区域以一个四元组定义,其坐标表示为(左,上,右,下).PIL使用一个以(0,0)代表左上角的坐标系统。同时也要注意坐标指向的位置是以像素标识,所以在上面这个例子中的区域刚好是300×300像素。
    现在,这个图区可以做一些处理然后粘贴回去。
    Example: 处理一个子区,再贴回去

region = region.transpose(Image.ROTATE_180)
im.paste(region, box)

    当粘贴一个区域时,该区域的大小必须与给定的大小吻合,另外,粘贴区也不能延展到图像外面。但是,原始图像和粘贴区域的格式并不需要一致。如果它们不一致,粘贴域会自动进行转化。(在下方的颜色转换部分会有详细讨论)
    这里是另一个例子
    Example: Rolling an image

def roll(image, delta):

“Roll an image sideways”
xsize, ysize = image.size
delta = delta % xsize
if delta == 0: return image
part1 = image.crop((0, 0, delta, ysize))
part2 = image.crop((delta, 0, xsize, ysize))
image.paste(part2, (0, 0, xsize-delta, ysize))
image.paste(part1, (xsize-delta, 0, xsize, ysize))
return image

    更进一步,使用一个可选参数,paste方法也可以实现透明蒙版效果。在这个蒙版中,值255表示这个粘贴图像在该位置完全不透明,值0意味着粘贴图像是完全透明的,而这之间的值则表示不同的透明度。
    PIL 也使你可以操作一个多道道图像的单个颜色通道。比如一个RGB图像。split方法创建一个新的图像集,其中每一个图像包含量原始图像的一个颜色通道。 merge方法使用两个参数,一个是模式,一个是图像组,将图像组重新组成合一个新的图像。下面这个例子将三个颜色通道合成一个RGB图像:
Example: 分割和合并颜色通道

r, g, b = im.split()
im = Image.merge(”RGB”, (b, g, r))

几何变换
    图像库提供方法来缩放和旋转图像。前者需要以二元组的方式提供新的尺寸参数,后者则需要一个逆时针方向的角度。
    Example: 简单几何变换。

out = im.resize((128, 128))
out = im.rotate(45) # degrees counter-clockwise
    将一枚图像旋转90度,既可以使用rotate方法,也可以使用transpose方法,后者同时也可以用于将一枚图像沿着它作重直或水平旋转。
    Example: 变换一坨图像

out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)

    使用transpose(ROTATE),或选用相应的rotate操作,在结果和显示上并无不同。
    更通用的图像变换方式可以使用transform方法。在后面的reference可以找到相关细节。

阅读(564) | 评论(0) | 转发(0) |
0

上一篇:pil-handbook翻译-1

下一篇:pil-handbook翻译-5

给主人留下些什么吧!~~