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("$@B%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 += '\n'

    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()

看一下效果:

原图(图片来源百度如有侵权请联系删除)                 效果图

 

 

目前大概学习了这么多,简单的写一下总结,为以后学习提供一个帮助

 

转载于:https://www.cnblogs.com/hong976737/p/9346671.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值