pillow模块


preface

Pillow(GITHUB链接)是一个对PIL友好的分支,PIL是一个Python图像处理库。

#安装依赖
#在可执行python代码的环境下执行即可
pip install pillow
pip show pillow

#奇怪,但是 pip install PIL 没有结果,应该是取代了PIL

一、基础

使用Image类:

# from Pillow import Image 显示 no module
from PIL import Image
im = Image.open("1.png")

print(im.format,im.size,im.mode) # --> PNG (1080, 2340) RGBA

im.show()  # 会打开外部程序展示图片

.

im.mode 说明
1 1-bit 像素, 黑和白, 一个像素占用一个byte
L 8-bit 像素, 黑和白
P 8-bit 像素, 使用调色板映射到任何其他模式
RGB 3x8-bit 像素, 真彩色
RGBA 4x8-bit 像素, 带透明度掩码的真彩色
CMYK 4x8-bit 像素, 分色
YCbCr 3x8-bit 像素, 颜色视频格式

.

# 提取子矩阵
box = (100, 100, 400, 400)
region = im.crop(box)

# PixelAccess Class
px = im.load()
print(px[4,4]) #返回(4,4)位置的RGBA值

二、实例

2.1 添加水印

from PIL import Image, ImageDraw, ImageFont

# 读取图片
lena = Image.open("pillow_data/lena.jpeg")

# 使用ImageDraw模块创建水印
draw = ImageDraw.Draw(lena)

# 使用ImageFont创建字体大小
font = ImageFont.truetype(font= "pillow_data/ARIALN.TTF", size= 18)
draw.text((10, 10), 'HELLO WORLD', font=font, fill='white')

# 显示
display(lena)

# 保存
lena.save("./pillow_data/lena_watermark.jpg")

2.2 字符画

from PIL import Image # PIL 是一个 Python 图像处理库

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
# 是我们的字符画所使用的字符集,一共有 70 个字符,字符的种类与数量可以自己根据字符画的效果反复调试的

WIDTH = 60 # 字符画的宽
HEIGHT = 45 # 字符画的高


# 将256灰度映射到70个字符上,也就是RGB值转字符的函数:
def get_char(r, g, b, alpha=256):  # alpha透明度
    if alpha == 0:
        return ' '
    length = len(ascii_char)
    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)  # 计算灰度
    unit = (256.0 + 1) / length
    return ascii_char[int(gray / unit)]  # 不同的灰度对应着不同的字符
    # 通过灰度来区分色块


if __name__ == '__main__':
    img = 'C:\\Users\\16413\\Pictures\\Saved Pictures\\3.jpg' # 图片所在位置
    im = Image.open(img)
    im = im.resize((WIDTH, HEIGHT), Image.NEAREST)
    txt = ""
    for i in range(HEIGHT):
        for j in range(WIDTH):
            txt += get_char(*im.getpixel((j, i))) # 获得相应的字符
        txt += '\n'
    print(txt)  # 打印出字符画
    # 将字符画 写入文件中
    with open("C:\\Users\\16413\\Pictures\\Saved Pictures\\output.txt", 'w') as f:
        f.write(txt)

2.3 生成验证码

import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter

# 随机字母:
def rndChar():
    return chr(random.randint(65, 90))

# 随机颜色1:
def rndColor():
    return (random.randint(64, 255), 
            random.randint(64, 255), 
            random.randint(64, 255))

# 随机颜色2:
def rndColor2():
    return (random.randint(32, 127), 
            random.randint(32, 127), 
            random.randint(32, 127))

# 240 x 60:
width = 60 * 4
height = 60

image = Image.new('RGB', (width, height), (255, 255, 255))

# 创建Font对象:
font = ImageFont.truetype(font= "RuiHeiXiTi.otf", size= 36)

# 创建Draw对象:
draw = ImageDraw.Draw(image)

# 填充每个像素:
for x in range(width):
    for y in range(height):
        draw.point((x, y), fill=rndColor())

# 输出文字:
for t in range(4):
    draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2())

# 模糊
image = image.filter(ImageFilter.BLUR)

# image.show()
display(image)

2.4 九宫格化图片

import sys
from PIL import Image, ImageDraw

img = Image.open("../Pillow_exercise/pillow_data/lena.jpeg")
img = img.resize((500, 500))
img_1 = ImageDraw.Draw(img)
w,h = img.size
xline1 = round(h / 3)
yline1 = round(w / 3)
xline2 = round(h / 3) * 2
yline2 = round(w / 3) * 2

img_1.line([xline1, 0, xline1, h], fill="white", width=6)
img_1.line([xline2, 0, xline2, h], fill="white", width=6)
img_1.line([0, yline1, w, yline1], fill="white", width=6)
img_1.line([0, yline2, w, yline2], fill="white", width=6)

display(img)

img.save("lena_new.jpg")

参考资料:


文章作者: ╯晓~
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ╯晓~ !
评论
  目录