Pillow tutorial

Posted piaoshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pillow tutorial相关的知识,希望对你有一定的参考价值。

from PIL import Image
im = Image.open("hopper.ppm")
from __future__ import print_function
print(im.format, im.size, im.mode)
#打应结果
PPM (512, 512) RGB

  让图片显示,im.show(),因为打开是暂时的所以显示图片效果不太好,而且还有15功能,所以一般用来测试显示

改变图片的后缀,pil可以根据文件内容,自己判断文件类型

from __future__ import print_function
import os, sys
from PIL 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)
        except IOError:
            print("cannot convert", infile)

 

Create JPEG thumbnails

如果后缀不合法会用第二个参数

from __future__ import print_function
import os, sys
from PIL 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")
        except IOError:
            print("cannot create thumbnail for", infile)

  

Identify Image Files

先打开文件确认类型,读取/解析会在稍后执行

from __future__ import print_function
import sys
from PIL import Image

for infile in sys.argv[1:]:
    try:
        with Image.open(infile) as im:
            print(infile, im.format, "%dx%d" % im.size, im.mode)
    except IOError:
        pass

  

Copying a subrectangle from an image

截取图片大小, (left, upper, right, lower),坐标 (0, 0) in the upper left corner,准确来说是300*300pixeels

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

  把图片反转180度再填回去

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

  

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))
#load是因为crop是个延迟操作,不这样会在第二步保存不到
    part1.load()
    part2.load()
    image.paste(part2, (0, 0, xsize-delta, ysize))
    image.paste(part1, (xsize-delta, 0, xsize, ysize))

    return image

  

Splitting and merging bands

拆分成原生三原色,换位置再合并

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

  简单的几何逆时针旋转,transpose也可以在90度内旋转,也可以水平活垂直旋转

out = im.resize((128, 128))
out = im.rotate(45)
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)

  不通像素之间图片

from PIL import Image
im = Image.open("hopper.ppm").convert("L")

  增强图像

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

  改变对比度

out = im.point(lambda i: i * 1.2)

  具体操作图片

# split the image into individual bands
source = im.split()

R, G, B = 0, 1, 2

# select regions where red is less than 100
mask = source[R].point(lambda i: i < 100 and 255)

# process the green band
out = source[G].point(lambda i: i * 0.7)

# paste the processed band back, but only where red was < 100
source[G].paste(out, None, mask)

# build a new multiband image
im = Image.merge(im.mode, source)

  你可以用这种方式调整对比度、亮度、颜色平衡和锐度

from PIL import ImageEnhance

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

  打开动态图,并跳帧播放一次结束

from PIL import Image

im = Image.open("animation.gif")
im.seek(1) # skip to the second frame

try:
    while 1:
        im.seek(im.tell()+1)
        # do something to im
except EOFError:
    pass # end of sequence

  循环播放

from PIL import ImageSequence
for frame in ImageSequence.Iterator(im):
    # ...do something to frame...

  在打印机上打印

from PIL import Image
from PIL import PSDraw

im = Image.open("hopper.ppm")
title = "hopper"
box = (1*72, 2*72, 7*72, 10*72) # in points

ps = PSDraw.PSDraw() # default is sys.stdout
ps.begin_document(title)

# draw the image (75 dpi)
ps.image(box, im, 75)
ps.rectangle(box)

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

ps.end_document()

  也可以这样打开

from PIL import Image
with open("hopper.ppm", "rb") as fp:
    im = Image.open(fp)

在一个比较大的tar文件中打开图片,可以通过seek和read增快找到速度

from PIL import Image, TarIO

fp = TarIO.TarIO("Tests/images/hopper.tar", "hopper.jpg")
im = Image.open(fp)

This is only available for JPEG and MPO files.

from PIL import Image
from __future__ import print_function
im = Image.open(file)
print("original =", im.mode, im.size)

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


#This prints something like:
original = RGB (512, 512)
draft = L (128, 128)

  

以上是关于Pillow tutorial的主要内容,如果未能解决你的问题,请参考以下文章

损坏的顶点和片段着色器

《Buildozer打包实战指南》实战打包pillow

《Buildozer打包实战指南》实战打包pillow

《Buildozer打包实战指南》实战打包pillow

AI常用框架和工具丨4. 图像处理库Pillow

AI常用框架和工具丨4. 图像处理库Pillow