PIL入门之一

参考来自http://effbot.org/imagingbook/introduction.htm以及PIL中文手册

1.使用 Image 类

Python Imaging Library中最重要的类是Image 类,它定义在与它同名的模块中。

有多种创建这个类的对象的方法:可以从文件中读取得到,也可以从其他图像经处理得到,或者创建一个全新的。

要从文件读取图像,可以使用Image.open 函数。

>>> import Image
>>> im = Image.open("2.jpg")
>>> print im.format,im.size,im.mode
JPEG (180, 237) RGB
>>> im.show()

format 属性表示图像的原始格式。如果图像不是从文件中读取的,则它被设置成 None。

size 属性是一个2元组,表示图像的宽度和高度 (以像素为单位)。

mode 属性定义图像的色彩通道的数量与名字,同时也包括像素的类型和颜色深度信息。

通常来说,灰度图像的mode是"L"(luminance),真彩色图像的mode是 "RGB" ,而用来打印的图像的mode是"CMYK"。


2.读写图像

PIL支持很多种的图象文件格式。要从磁盘上读取文件,使用 Image 模块提供的open 函数。你不必了解你要打开的文件的格式,库会自动根据文件的内容来确定图像的格式。

要保存文件,使用Image 类的save 方法。保存文件时,文件名就变得非常重要,除非你指定格式,否则库会根据文件扩展名来决定使用哪种格式存储。

将文件转换成 JPEG:命令行输入infile

import os, sys
import Image

for infile in sys.argv[1:]:
    f, e = os.path.splitext(infile)
    outfile = f + ".jpg"
    if infile != outfile:
        try:
            Image.open(infile).save(outfile)
            print outfile
            Image.open(outfile).show()
            
        except IOError:
            print "cannot convert", infile

【注意】调用show方法时,win7自带的图片查看器可能会失败,这里我用的是PhotoFiltre 7

创建 JPEG 缩略图

import os, sys
import Image

size = 128, 128

for infile in sys.argv[1:]:
    outfile = os.path.splitext(infile)[0] + ".thumbnail"
    if infile != outfile:
        try:
            im = Image.open(infile)
            im.thumbnail(size)
            im.save(outfile, "JPEG")
            im.show()
        except IOError:
            print "cannot create thumbnail for", infile

3.裁剪、粘贴和合并图像

import Image

box = (100, 100, 400, 400)

im = Image.open('3.jpg')
region = im.crop(box)
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
im.show()

Image 类提供一些对图像中的某一区域进行处理的方法。要从图像中提取一块子矩形区域,使用 crop方法区域由一个4元组定义,表示为坐标是 (left, upper,right, lower)。 

PIL使用左上角为 (0, 0)的坐标系统。同时要注意,这些坐标指向像素之间的位置,因此上述例子中描述的区域的大小为300x300像素。

区域图像能够经过某些特定的处理并粘回原处。当把区域粘回图像时,指定的区域大小必须和区域图像的大小相同。

此外,区域不能超出图像的边界。然而,原始图像的模式和区域图像的模式不必相同。如果不相同,区域图像的模式会在粘贴前被自动转换。

另外一个例子:滚动一幅图像

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值