python Image库

来源:互联网 发布:php oa 工作流引擎 编辑:程序博客网 时间:2024/06/04 23:32
由于计算机的存在,不再需要用纸和笔来绘制图片,取而代之的是代码,这篇博文主要是讲如何用Python的Image库来作图。

一,Image库的安装方法
(1)下载Image库,下载链接 http://www.pythonware.com/products/pil/
(2)运行,安装
(3)成功

二,使用
1,修改图片文件格式
Python的Image库实际上是Image类,类里有很多方法可以工我们使用。对于图片的打开,可以使用open();对于图片的保存,可以使用save()。下面是实例代码:
from PIL import Image
import os
import sys

for filename in sys.argv[1:]:
f,e = os.path.splitext(filename)
out = f + “.png”
if out != filename:
try:
Image.open(filename).save(out)
except IOError :
print “sorry,this file can transfer”

  这段代码的实现的功能是在Windows操作系统中,在运行里输入cmd命令调出dos窗口,再用dos命令运行python,在我们输入命令时,要输入图片的文件名(要带着扩展名一起输入)。首先切换到程序所在的目录下,输入命令,形式为“python python文件名(包括后缀)  图片1文件名(包括后缀)  图片2文件名(包括后缀) ........”,注意图片的目录一定要和Python程序文件在同一目录下。  命令输入后,图片的文件名便放在了数组argv里下标从1开始的位置(0号下标存放Python文件名)。对于每一个文件名,利用os.path库的splitext函数将文件名和后缀名分开,随后在文件名后加上.png(你可以加你想要转换的任意图片格式的后缀名),判断与之前的文件名(包括之前的后缀)是不是相同。如果相同,说明那就是你想要的图片格式,不需要修改;如果不同,你就需要修改这个图片的格式,修改方式很简单,改后缀名就可以了。  在读取、写入图片的时候可能会产生IOError异常,故进行抛异常处理。 同样,也可以改变图片的尺寸:

from PIL import Image
import os
import sys

size = 60,60
for filename in sys.argv[1:]:
f,e = os.path.splitext(filename);
out = f + “.thumbnail”
if out != filename:
try:
im = Image.open(filename)
im.thumbnail(size)
im.save(filename)
except IOError:
print “sorry,can not transfer”
2,对图像特定区域操作
有时候我们希望通过对图像区域的局部操作,产生奇妙的效果。如果要对图片进行局部操作,首先应该划出一片区域,这里使用crop()函数。crop()里的参数就是区域,详细的讲,就是矩形区域的左上角坐标和右下角坐标。下面是实例代码:
from PIL import Image
import os
import sys

im = Image.open(“kobe.png”)
box = (0,0,70,70)
region = im.crop(box)
region = region.transpose(Image.ROTATE_180)
im.paste(region,box)
im.save(“fat.png”)
这段代码实际上利用transpose()函数把图片的一部分区域翻转180度。拓展一下,transpose()函数的其它参数及意义可归纳为:
Image.ROTATE_90 旋转90度
Image.ROTATE_270旋转270度
Image.FLIP_LEFT_RIGTH 水平方向的镜像
Image.FLIP_TOP_BOTTOM 垂直方向的镜像
需要注意的是,保存的图片不能和原图片重名,否者不会有任何效果。此外,上述示例代码中的文件名是我本地计算机的图片的文件名,读者根据自己实际情况修改,切不可直接复制黏贴

 利用对特定区域的操作,也可以设置滚动效果,即从一边出去,从另一边进入的效果。实现代码如下:

from PIL import Image
import os
import sys

def roll(image,distance):
sizex,sizey = image.size
alter = distance % sizex
if alter == 0:
return image

part1 = image.crop((0,0,alter,sizey))part2 = image.crop((alter,0,sizex,sizey))image.paste(part2,(0,0,sizex - alter,sizey))image.paste(part1, (sizex - alter, 0, sizex, sizey))return image

picture = Image.open(“kobe.png”)
picture = roll(picture,221)
picture.save(“james.jpg”)

3,图像模式
对于RGB模式的图像,其显示出来的效果实际上是三个通道的叠加,利用相加混色的原理,混合后最终呈现出来。Python的Image库提供混合的借口merge()函数。那么既然可以混合,为什么不可以拆开呢?why not?事实上可以,Python提供分离多通道图像的函数split(),对于RGB等多通道图像,函数将返回多个通道的集合;对于单通道图像,函数返回图像本身。我们可以将某一RGB图像的通道进行分离,再重新组合成新的图像。下面是实例代码:

from PIL import Image
import os
import sys

img1 = Image.open(“star.jpg”)
r,g,b = img1.split()
img1 = Image.merge(“RGB”,(b,r,g))
img1.save(“fuyuanbin.jpg”)

   当执行到"r,g,b = img1.split()"这一部分时,通常会报类似“ 'NoneType' object has no attribute 'bands'”的错误。放心,这不是我们的问题,是Image库的问题,是split()这个函数本身的问题,我们只需要在Image.py中定位到报错的语句,然后将相关部分注释掉就可以了。还有一点要注意的是,merge()的第二个参数里不是RGB值,而是通道,不可以使用三个整数,必须通过分离图像得到。
0 0
原创粉丝点击