pillow学习
Posted hong976737
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pillow学习相关的知识,希望对你有一定的参考价值。
这几天学习了Pillow(为pyhton加强了图像处理能力),做一个简单的总结,当然这只是很浅显的一部分罢了,想要深入学习的可以移步pillow官方文档
首先说一下,这个库可能会用到哪个地方,好吧这些都是借鉴pillow的中文网站
1.图像存储,你可以用它来建立缩略图,转换格式,打印图片,验证图片格式等
2.图像显示,该库为win提供了一个Windows DIB interface
3.图像处理,基本的图像处理,包括点操作,使用内置卷积内核过滤,色彩空间装换,支持更改图像大小、旋转、自由变换,还有一个直方图方法允许你统计图像用于对比增强和全局统计分析
下面说一下我看到的几个简单的图像处理功能
from PIL import Image, ImageFilter # 加载一个图像 img = Image.open("image.jpg") # 返回一个包含图片 # 1.format(来源) # 2.mode(图像bands数量名称和像素类型深度)常见的mode有(L灰度图像,RGB真彩图像,CMYK出版图像) # 3.size(一个存储图像尺寸的元组)的信息, #显示图像 img.show() # 改变图像格式 Image.open(‘image.jpg‘).save(‘image.png‘) # 创建缩略图 img.thumbnail((70, 100)) # 图像保存 img.save("image.jpg") # 复制图片一个区域,同样是一个元组(左,上,右,下) image = img.crop((100, 100, 400, 400)) # 图像旋转选定特定参数 im = image.transpose(Image.ROTATE_180) # 将复制的图片粘贴到元图像上,旋转180°, 注意:box大小一定要相同匹配 box = (200, 200, 500, 500) img.paste(im, box) # 几何变换 # 修改图像尺寸 img = img.resize((200, 200)) # 旋转图像,自定义参数 img = img.rotate(45) # 图像颜色模式转换 img = Image.open(‘image.jpg‘).convert("L") # 增强过滤器,增强图像颜色效果 img = img.filter(ImageFilter.DETAIL) img.show()
接下来我们来用它做一些有意思的事
1.生成简单的验证码
from PIL import Image, ImageDraw, ImageFont, ImageFilter, ImageChops import random class Image_code(): def __init__(self): """定制图片默认宽高,面板""" self._height = 100 self._width = 200 self.image = Image.new(‘RGBA‘, (self._width, self._height), ‘grey‘) @property def content(self): """验证码内容""" list = [‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, ‘H‘, ‘I‘, ‘J‘, ‘K‘, ‘L‘, ‘M‘, ‘N‘, ‘O‘, ‘P‘, ‘Q‘, ‘R‘, ‘S‘, ‘T‘, ‘U‘, ‘V‘, ‘W‘, ‘X‘, ‘Y‘, ‘Z‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘, ‘i‘, ‘j‘, ‘k‘, ‘l‘, ‘m‘, ‘n‘, ‘o‘, ‘p‘, ‘q‘, ‘r‘, ‘s‘, ‘t‘, ‘u‘, ‘v‘, ‘w‘, ‘x‘, ‘y‘, ‘z‘, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] return "".join([str(i) for i in random.sample(list, 4)]) def canvas(self, image): """生成背景中随机点效果""" draw = ImageDraw.Draw(image) for i in range(200): for j in range(200): draw.point((i, j), fill=random.randint(-128, 0)) def tilt(self): """ 实现图片中内容倾斜,由于无法直接使其倾斜 1.使原图片倾斜,裁剪边角多余 2.创建相同类型的图片面板 3.使用composite融合两张图片(注意融合的两张图片的mode应该相同) """ img = Image.new(‘RGBA‘, (self._width, self._height), ‘red‘) self.canvas(img) image = self.image.rotate(random.randint(-10, 10), expand=0) self.image = Image.composite(image, img, image) def write(self): """面板上写内容""" font = ImageFont.truetype("arial.ttf", 60) draw = ImageDraw.Draw(self.image) draw.text((28, 20), self.content, font=font, fill=random.randint(0, 255)) def run(self): self.canvas(self.image) self.write() self.tilt() self.image.save(‘image.png‘) a = Image_code() a.run()
看一下效果:
2.图片转换为字符串输出
from PIL import Image class Pixelate(): def __init__(self, image, file_name): self._full_style = list("[email protected]%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`‘.") self._unit = 256 / len(self._full_style) self.image = image self.file_name = file_name self.s = ‘‘ def full(self): """使用约定好的字符填充像素点""" img = Image.open(self.image).convert("L") for i in range(0, img.size[1], 2): for j in range(0, img.size[0], 2): pixel = img.getpixel((j, i)) # 宽高 像素点 # 字符填充规则 self.s += self._full_style[int(pixel / self._unit)] self.s += ‘ ‘ def conserve(self, file_name): """字符保存到文件""" with open(file_name, ‘w‘) as f: f.write(self.s) def run(self): self.full() self.conserve(self.file_name) print("成功") image = input("图片路径:") file_name = input("要保存的文件名:") pix = Pixelate(image, file_name) pix.run()
看一下效果:
原图(图片来源百度如有侵权请联系删除) 效果图
目前大概学习了这么多,简单的写一下总结,为以后学习提供一个帮助