Python PIL库详解

PIL库

1、导入图片

from PIL import Image

im = Image.open("1.jpg")

# 或者从打开的文件中导入
with open("1.jpg", "rb") as fp:
    im.Image.open(fp)

# 或者读取二进制数据
import io
im = Image.open(io.BytesIO(buffer))

# 或者从.tar文件中读取
from PIL import TarIO
fp = TarIO.TarIO("text.tar", "1.jpg")
im = Image.open(fp)

# 打开失败将出现IOError异常

2、图片信息

属性 含义 返回值
format 格式 图片格式名
size 大小 包含宽度和高度的二元组
mode 类型 “I”:灰度图像"RGB":真彩色图像"CMYK":预印图像

3、Image类方法

  • im.show()  # 显示图片
    
  • im.save(filename, mode)  # 保存图片
    
  • im.transpose(Image.ROTATE_180)  # 旋转180度
    im.transpose(Image.FLIP_LEFT_RIGHT)  # 左右颠倒
    out = im.transpose(Image.FLIP_TOP_BOTTOM)  # 上下颠倒
    
  • im.resize((128, 128))  # 重新设置大小
    
  • im.rotate(45) # 旋转
    
  • im.filter()  #使用过滤器
    
  • im.point()  # 采用点变换
    
  • im.merge(mode, RGB)
    

4、图片格式转换

import os
import sys
from PIL import Image

# 命令行模式下运行程序,sys.argv获取输入的字符串
# 如输入:python convert.py test.jpg
# 则sys.argv[0]为"convert.py", sys.argv[1]为"test.jpg"
# 输入的"python"不予获取
for infile in sys.argv[1:]:
    f, e = os.path.splitext(infile)
    outfile = f + ".jpg"
    if infile != outfile:
        try:
            with Image.open(infile) as im:
                im.save(outfile)
                print("saved", outfile)
        except IOError:
            print("cannot convert", infile)

5、创建缩略图

import os
import sys
from PIL import Image


size = (128, 128)

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

6、截取图片

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

7、粘贴图片

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

8、颜色带

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

9、模式变换

from PIL import Image
with Image.open("1.jpg") as im:
	im = im.convert("L")

10、图像处理

  • filter

    from PIL import ImageFilter
    
    out = im.filter(ImageFilter.DETAIL)
    
  • point

    # 每个点的像素都乘以1.2
    out = im.point(lambda i: i * 1.2)
    
  • 处理单独的颜色带:

    source = im.split()
    
    R, G, B = 0, 1, 2
    
    mask = source[R].point(lambda i: i < 100 and 255)
    out = source[G].point(lambda i: i * 0.7)
    source[G].paste(out, None, mask)
    im = Image.merge(im.mode, source)
    

11、增强图像

enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("%30 more contrast")

12、图像序列

with Image.open("1.gif") as im:
    im.seek(1) # 跳到第二帧
    try:
        while 1:
            im.seek(im.tell()+1)
            im.show()
    except EOFError:
        pass
    # 序列读取结束时将返回EOPError异常
from PIL import ImageSequence
for frame in ImageSequence.Iterator(im):
	frame.show()

13、Postscript

from PIL import Image, PSDraw

with Image.open("1.jpg") as im:
    title = "canteen"
    box = (1*72, 2*72, 7*72, 10*72)
    ps = PSDraw.PSDraw()
    ps.begin_document(title)

    ps.image(box, im, 75)
    ps.rectangle(box)

    ps.setfont("HelveticaNarrow-Bold", 36)
    ps.text((3*72, 4*72), title)

    ps.end_document()
    im.show()

14、draft模式

# 只适用于JPEG和MPO文件
from PIL import Image

with Image.open(file) as im:
    print("original =", im.mode, im.size)

    im.draft("L", (100, 100))
    print("draft =", im.mode, im.size)

猜你喜欢

转载自blog.csdn.net/qq_45359344/article/details/106957452
今日推荐