note

图片模式转换

==img.convert(‘RGBA’)==:

modes Description
1 1位像素,黑白图像,存成8位像素
L 8位像素,黑白
P 9位像素,使用调色板映射到任何其他模式
RGB 3*8位像素,真彩
RGBA 4*8位像素,真彩+透明通道
HSV H (色彩/色度), S (饱和度), V (亮度)
CMYK 4*8位像素,印刷四色模式或彩色印刷模式
YCbCr 3*8位像素,色彩视频格式
I 32位整型像素
F 33位浮点型像素

一、Image

from PIL import Image
from io import BytesIO
# 读取一张图片
im = Image.open('2.jpg')  # 根据文件名读取图像
b = BytesIO()
im.save(b,'JPEG')  # 保存图片
data = b.getvalue()  # 获取图片的二进制信息
print(data) 

# 图片格式
print('格式:', im.format)
# 图片模式
print('模式:', im.mode)  # L:灰度  RGB:真彩色 CMYK:出版图像
# 图像宽高
print('宽高:', im.size)
print('完整信息:', im.info)
try:
    im.verify()  # 检查图像文件的完整性
except:
    pass
finally:
    im.show() # 显示一张图片
    im.save('4.jpg', 'JPEG')  # 保存图片
from PIL import Image
from io import BytesIO
import requests

# 创建新图片:
im1 = Image.new('RGBA', (400, 400), 'red')
# 从二进制中读取图片
res = requests.get('http://pic.sc.chinaz.com/files/pic/pic9/202003/zzpic24077.jpg').content
im2 = Image.frombytes('RGB', (100, 100), data=res)  # 只能解析纯二进制图片
# 从网页中读取图片
im2 = Image.open(BytesIO(res))
b = BytesIO()
im2.save(b, format="PNG")
im2.show()

# 两张图片相加:
im1 = Image.new('RGBA', (400, 400), 'red')
im2 = Image.new('RGBA', (400, 400), 'blue')
Image.blend(im1, im2, 0.5)  # 两个图片大小一定要一样(效果见图4)

# 点操作:
im1.point(lambda x: x * 1.2)

# 图片裁剪:
box = (100, 100, 200, 200)
region = im.crop(box)  # 设置要裁剪的区域

# 图片粘贴(合并)
im1.paste(region, box)  # 粘贴box大小的region到原先的图片对象中。(见图5)
# 可以不给第二个参数,就是把图region的按左上角贴到图im1的左上角
# im1.paste(region, (100, 100)) # 指定左上角位置为(100, 100),不给就默认是(0, 0)

im1 = Image.new('RGB', (400, 400), 'red')
im2 = Image.new('RGBA', (400, 400), 'blue')

# 通道分离:
r, g, b = im1.split()  # 分割成三个通道,此时r,g,b分别为三个图像对象。
print(r, g, b)
# 通道合并:
im3 = Image.merge("RGB", (b, g, r))  # 将b,r两个通道进行翻转。

# 改变图片的大小:
im4 = im1.resize((300, 200))
im4.show()

# 图片翻转
im5 = im1.transpose(Image.FLIP_LEFT_RIGHT)  # 左右翻转
im6 = im2.transpose(Image.FLIP_TOP_BOTTOM)  # 上下翻转
im5.show()
im6.show()

# 获取某个像素位置的值
im1.getpixel((43, 23))

# 写某个像素位置的值
im1.putpixel((10, 20), (255, 32, 43))

# 创建图像缩略图
im1.thumbnail((10, 20))  # 图片大小为(10,20)
im1.show()

# 旋转图像
im8 = im1.rotate(45)  # 逆时针旋转45度
im8.show()
注:RGB有三个通道,RGBA有四个通道,以上图片显示效果都在图6中

二、ImageDraw

这个模块主要就是画图和打水印时用的,具体方法请看下面:

from PIL import Image, ImageDraw

# 画点
im = Image.open('2.jpg')
draw = ImageDraw.Draw(im)
draw.point([100, 200], fill='blue')  # 指定点的坐标和颜色

# 创建一个正方形。[x1,x2,y1,y2]或者[(x1,x2),(y1,y2)]  fill代表的为颜色
draw.line([100, 100, 100, 600], fill='pink')  # 直线
draw.line([100, 100, 600, 100], fill='green')
draw.line([600, 100, 600, 600], 'black')
draw.line([100, 600, 600, 600], 'blue')

# 弧形 [x1,x2,y1,y2]  弧度 颜色
draw.arc([100, 100, 600, 600], 0, 360, fill='black')
draw.arc([200, 100, 500, 600], 0, 360, fill='yellow')

# 画圆  [x1,x2,y1,y2] outline边框颜色 fill填充颜色
draw.ellipse([100, 100, 600, 600], outline='black', fill='white')

# 画半圆 [x1,x2,y1,y2]  弧度 outline弦线颜色 fill填充颜色
draw.chord([100, 100, 600, 600], 0, 360, outline=125)
draw.chord([100, 100, 600, 600], 0, 90, outline=158)
draw.chord([100, 100, 600, 600], 90, 180, outline=99, fill='gray')

# 扇形 [x1,x2,y1,y2]  弧度 outline弦线颜色 fill填充颜色
draw.pieslice([100, 100, 600, 600], 180, 210, outline=255)
draw.pieslice([100, 100, 600, 600], 30, 80, fill=255)

# 多边形
draw.polygon([10, 23, 45, 6, 77, 87], outline='orange')
draw.polygon([10, 20, 30, 40, 50, 90, 70, 80, 90, 100], fill='red')

# 矩形(坐标给的是(x1, y1, x2, y2),即矩形的左上角、右下角)
draw.rectangle((200, 200, 500, 500), outline="white")
draw.rectangle((250, 300, 450, 400), fill=128)

# 文字
text = 'hello world '
# 颜色
draw.ink = 0 + 0 * 256 + 255 * 256 * 256
# 加载到图片上
draw.text([200, 100], text)
im.show()

三、ImageEnhance

主要是设置图片的颜色对比度亮度锐度啥的,增强图像。

from PIL import ImageEnhance
im1 = Image.open('4.jpg')

# 调整图像的颜色平衡
cl = ImageEnhance.Color(im1)
ce = cl.enhance(1.2)  # 对选择的属性数值增强1.3倍
ce.show()

# 调整图像的对比度
ct = ImageEnhance.Contrast(im1)
ch = ct.enhance(3.4)
ch.show()

# 调整图像的亮度
br = ImageEnhance.Brightness(im1)
be = br.enhance(2.2)
be.show()

# 调整图像的锐度
sp = ImageEnhance.Sharpness(im1)
se = sp.enhance(200)
se.show()

四、ImageFont

字体模块,主要是读取系统内字体以及给图片添加水印效果

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
# simhei.ttf
font = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc', size=40)
im = Image.open('4.jpg')
dw = ImageDraw.Draw(im)
# file还可以用颜色的方式 filee=(255, 0, 0)  # 这也是红色,RGB的格式
dw.text((50, 60), '你好,world', fill='red', font=font)  
# 还能获取输入文本的大小;
text_size = dw.textsize("你好adadada", font=font)  # (w, h),字体的高在font设置时就确定了,这里是40
im.show()

​ 注意:第4行中的字体一定是在存在的,代码中若使用到了的字体,尽量使用相对路径,然后把字体就放在相对路径。windows下的字体都是在C:\Windows\Fonts

五、ImageGrab

from PIL import ImageGrab 
im1 = ImageGrab.grab((0,0,800,200))  # 截取屏幕指定区域的图像 
im2 = ImageGrab.grab()  # 不带参数表示全屏幕截图
im1.show()
im2.show()

六、ImageFilter

过滤图像的效果。

from PIL import Image, ImageFilter
im = Image.open('4.jpg')

# 高斯模糊 
im1 = im.filter(ImageFilter.GaussianBlur)
im1.show()

# 普通模糊 
im2 = im.filter(ImageFilter.BLUR)
im2.show()

# 边缘增强 
im3 = im.filter(ImageFilter.EDGE_ENHANCE)
im3.show()

# 找到边缘 
im4 = im.filter(ImageFilter.FIND_EDGES)
im4.show()

# 浮雕 
im5 = im.filter(ImageFilter.EMBOSS)
im5.show()

# 轮廓 
im6 = im.filter(ImageFilter.CONTOUR)
im6.show()

# 锐化 
im7 = im.filter(ImageFilter.SHARPEN)
im7.show()

# 平滑 
im8 = im.filter(ImageFilter.SMOOTH)
im8.show()

# 阙值平滑
im9 = im.filter(ImageFilter.SMOOTH_MORE)
im9.show()

# 细节 
im10 = im.filter(ImageFilter.DETAIL)
im10.show()

pillow 还算是比较强大的一个 模块,他可以轻松实现截屏 水印效果,并且还可以制作字符画,下面请看:

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

txt = 'meimei'
font = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc', 9)  # 9为字体大小
im_path = '1.jpg'  # 原图路径
im = Image.open(im_path)
width, height = im.size
newImg = Image.new("RGBA", (width, height), (10, 10, 10))  # 背景色rgb,偏黑显示好一些
x = 0
for i in range(0, height, 9):  # 需要与字体大小一致
    for j in range(0, width, 9):  # 需要与字体大小一致
        a, b, c = im.getpixel((j, i))  # 获取像素
        draw = ImageDraw.Draw(newImg)
        draw.text((j, i), (txt[x % (len(txt)):x % (len(txt)) + 3]), fill=(a, b, c), font=font)
        x += 3
        del draw
newImg.save('00.png', 'PNG')