最近用到了Python里处理图片的Pillow库,简单的操作先记录下来。下面会有对代码中标记了数字的部分进行解析,更多内容请查看官方文档,入口点这里。
代码段如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PIL import Image
# 1 打开图片
tower = Image.open("tower.jpg")
(x, y) = tower.size
# 2 底图
pic = Image.new('RGB', (2*x,2*y), (255,255,0))
# 3 拼图
m,n=int(x/2),int(y/2)
pic.paste(tower, (m,n))
# 4 处理图片
pic1=pic.resize((30,40))
pic2=pic.transpose(Image.ROTATE_90)
pic3=pic.rotate(90)
pic4=pic.convert("RGBA")
pic5=pic.convert("L")
# 5 图片保存
pic1.save("./pictures/pic1.jpg")
pic2.save("./pictures/pic2.jpg",quality=95)
pic3.save("./pictures/pic3.jpg")
pic4.save("./pictures/pic4.png")
pic5.save("./pictures/pic5.jpg")
pic1.save("./pictures/pic6.jpg",dpi=(300,300))
原始图片如下:
#1 最简单的打开图片,打开之后返回一个image
对象,通过它可以获取图片的一些信息,比如im.format
,im.size
, im.mode
等。
#2 新建一个空白图片,需要提供图片的mode
,size
和color
。mode
包括RGB,RGBA,L,P等,比如一个jpg的图片,mode
就是RGB,png图片对应的就是RGBA。color
可以用颜色单词,比如red
,可以用RGB值,比如(255
,255
,255
),或者颜色代码,比如#FFFFFF
.
#3 把tower粘贴在空白图片的中心位置。其中底图左上角坐标点为起始点(0
,0
),(m
,n
)表示我想要粘贴的图片的左上角位置。
效果如下:
#4 处理图片。
resize
:缩放图片,这个会改变图片的质量,一般用的比较多的就是直接按照设定的比例缩放。
transpose
:这个单词是置换,调换,它是可以把图片完全旋转指定角度。
效果如下:
rotate
:旋转图片,旋转之后原来的位置会显示为黑色。
效果如下:
convert
:转换图片为其他模式。比如想把jpg改为png,则改为RGBA
,图片转黑白,则改为L
,更多mode
看这里。
L模式效果如下:
#5 图片保存。保存不同类型的图片,支持不同类型的参数。之前看网上很多人说PIL不支持dpi
设置,其实是支持的。不同类型图片支持的参数可以看这里。
这里想多说几句dpi
,它和图片的物理尺寸相关。如果不设置dpi
的话,一般jpg默认的是96(在我电脑上面保存是96)。dpi
描述了图片的精度。同样像素的两张图片,dpi
越高,图片的物理尺寸越大。如下图中,pic1为dpi=96
,pic6为dpi=300
打印出实际尺寸的差距:
再举个例子,如果想到打出来固定物理尺寸的图片,又想增加精度,就需要设置较高的dpi
,这个时候对应的像素值也会增加。如果有类似需求,可以先通过PS工具,打开任意图片,选择工具栏中的调整尺寸,填写期望的dpi和物理尺寸,算出对应的像素值,然后resize
到对应的像素值,再使用dpi
进行save
。
我也是最近有需要打印指定物理尺寸图片的需求,才接触这部分内容,如果有什么不明白的,欢迎一起讨论。