记录博客 ZH-BLOG

Python 图片处理 Pillow

时间:2018-07-25 23:36:05分类:python

1. RGBA 颜色和透明度

>>> from PIL import ImageColor
>>> ImageColor.getcolor('red', 'RGBA')
(255, 0, 0, 255)
>>> ImageColor.getcolor('blue', 'RGBA')
(0, 0, 255, 255)
# 透明度:0 表示透明;255 表示不透明

2. 加载图片,读取图片基本属性

>>> from PIL import Image
>>> im = Image.open(r'e:\path\6.jpg')
>>> im.size
(650, 365)
>>> width, heigth = im.size
>>> width, height = im.size
>>> width, height
(650, 365)
>>> im.filename
'e:\\path\\6.jpg'
>>> im.format
'JPEG'
>>> im.format_description
'JPEG (ISO 10918)'
>>> im.save(r'e:\path\rb.png') # 相当于复制了一份图片并重命名

3. 创建图片

>>> im = Image.new('RGBA', (100,200), 'purple')
>>> im.save(r'e:\path\purple.png')
>>> im = Image.new('RGBA', (100,200))
>>> im.save(r'e:\path\w.png')

4. 裁剪图片

>>> im = Image.open(r'e:\path\rb.png')
# 左上与右下坐标确定一个矩形区域
>>> im.crop((250,20,450,80)).save(r'e:\path\crop.png')

5. 通过粘帖将两张图片进行合成操作

>>> face_im = Image.open(r'e:\path\purple.png')
>>> face = face_im.crop((0,0,20,20)) # 徽章图片大小 20×20
>>> im = open(r'e:\path\rb.png')
>>> im = Image.open(r'e:\path\rb.png')
>>> im.paste(face, (0,0)) # 在图片开始处加上徽章
>>> im.save(r'e:\path\paste.png') # 保存合成的图片

练习:将徽章平铺整个图片

>>> im = Image.open(r'e:\path\paste.png')
>>> width, height = im.size
>>> face_width, face_height = face.size
>>> for left in range(0, width, face_width): # 左坐标点间隔为徽章图片宽度
	for top in range(0, height, face_height): # 同理高度间隔为徽章图片高度
		im.paste(face_im,(left, top))

		
>>> im.save(r'e:\path\paste_all.png') # 保存合成图片

6. 调整图片大小

>>> im = Image.open(r'e:\path\crop.png')
>>> width, height = im.size
>>> im_resize = im.resize((int(width/2), int(height/2)))
>>> im_resize.save(r'e:\path\resize.png')

7. 徽章图片加透明度

>>> flag = Image.new('RGBA', (30,30), (0,255,0,100))
>>> im.size
(650, 365)
>>> im.paste(flag, (100,100), flag) # 第三个参数设置透明度
>>> im.save(r'e:\path\pf.png')

8. 旋转图片

>>> im = Image.open(r'e:\path\rb.png')
>>> im.rotate(90).save(r'e:\path\rb_90.png')
>>> im.rotate(180).save(r'e:\path\rb_180.png')
>>> im.rotate(90).resize((365,650)).save(r'e:\path\rbz_90.png')
>>> im.rotate(270, expand=True).save(r'e:\path\rb_270.png') # expand = True 会改变图片大小以适应整个图片

效果:1)rb.png  2) rb_90.png  3) rb_180.png  4) rb_270.png

rb.png rb_90.png rb_180.png rb_270.png

9. 图片的镜像翻转

>>> im.transpose(Image.FLIP_LEFT_RIGHT).save(r'e:\path\rb_lr.png') #左右翻转
>>> im.transpose(Image.FLIP_TOP_BOTTOM).save(r'e:\path\rb_tb.png') # 上下翻转

10. 图片像素

>>> im = Image.new('RGBA', (100,100))
>>> for x in range(100):
	for y in range(50):
		im.putpixel((x,y),(210,210,210))

		
>>> for x in range(100):
	for y in range(50,100):
		im.putpixel((x,y),ImageColor.getcolor('darkgray','RGBA'))
>>> im.getpixel((50,50))
(169, 169, 169, 255)
>>> im.save(r'e:\path\pixel.png')

11. 画图

>>> im = Image.new('RGBA', (200,200), 'white')
>>> from PIL import ImageDraw
>>> draw = ImageDraw.Draw(im)
>>> draw.line([(0,0),(199,0),(199,199),(0,199),(0,0)], fill='black')
>>> draw.rectangle((20,30,60,60), fill='blue')
>>> draw.ellipse((120,30,160,60),fill='red')
>>> draw.polygon(((57,87),(79,62),(94,85),(120,90),(103,113)),fill='brown')
>>> for i in range(100,200,10):
	draw.line([(i,0),(200,i-100)],fill='green')

	
>>> im.save(r'e:\path\draw.png')

效果图:

draw.png

12. 绘制文本

>>> from PIL import Image, ImageDraw, ImageFont
>>> im = Image.new('RGBA', (200,200), 'white') # 200×200 白色画布
>>> draw = ImageDraw.Draw(im)
>>> draw.text((20,150),'Hello',fill='purple') # 在坐标点(20,150)处绘制文本,颜色为紫色
>>> font = ImageFont.truetype(r'c:\Windows\Fonts\Gabriola.ttf',32) # 字体,Windows字体库中任意一字体均可,字体大小32
>>> draw.text((100,150), 'howdy', fill='gray', font=font) # 使用字体绘制文本
>>> im.save(r'e:\path\text.png')

效果图:

text.png

13. 动态图 gif

import os
from PIL import Image

# 解析gif
os.chdir(os.path.join('E:\\','path'))
# os.makedirs('gif',exist_ok=True)
# im=Image.open('earth.gif')
# try:
#     i=1
#     while True:
#         im.seek(im.tell())
#         new_image=Image.new('RGBA',im.size,'white')
#         new_image.paste(im)
#         new_image.save('gif/%s.png'% i)
#         i+=1
#         im.seek(im.tell()+1)
# except EOFError:
#     pass

# 合成gif
im=Image.open('gif/1.png')
# im=Image.new('RGBA',im_1.size,'black') # 避免开始和每次循环时出现此图片帧
image_list=[]
for i in range(1,len(os.listdir('gif'))+1): # 按顺序添加
    image_list.append(Image.open('gif/%s.png'% i))
im.save('newgif.gif',save_all=True,append_images=image_list,duration=200,loop=0,disposal=0)

官网实例:

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