zoukankan      html  css  js  c++  java
  • PIL实现图片框架以及生成图片验证码

    1. PIL的基本概念

    PIL:即Python Imaging Library,是Python平台事实上的图像处理标准库。

    PIL中涉及通道(bands)和模式(mode)这两个重要概念。

    (1)通道

    每张图片都是由一个或者多个数据通道构成。PIL允许在单张图片中合成相同纬度和深度的多个通道。

    以RGB图像为例,每张图片都是由三个数据通道构成,分别是R、G、B通道,而对于灰度图像,则只有一个通道。

    (2)模式

    图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:

    1: 1位像素,表示黑和白,但是存储的时候每个像素存储为8bit

    L: 8位像素,表示黑和白

    P: 8位像素,使用调色板映射到其他模式。

    RGB: 3*8位像素,为真彩色。

    RGBA: 4*8位像素,有透明通道的真彩色。

    CMYK: 4*8位像素,颜色分离。

    YCbCr: 3*8位像素,彩色视频格式。

    I: 32位整型像素

    F: 32位浮点型像素

    PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)

    2. 图片框架实现

     1 from PIL import Image, ImageFilter
     2 
     3 img = Image.open('微微一笑很倾城.jpg')
     4 
     5 width, height = img.size
     6 print(width, height)
     7 # img = img.thumbnail(width//10, height//10)
     8 
     9 # 旋转
    10 # img = img.rotate(45)
    11 
    12 # 通道数
    13 bands = img.getbands()
    14 print(bands)
    15 
    16 # 灰度化
    17 # img = img.convert('L')
    18 # print(img.getbands())
    19 
    20 # 获取像素值
    21 pixes = img.getpixel((200, 200))
    22 print(pixes)
    23 
    24 # 滤波器,滤镜
    25 # img = img.filter(ImageFilter.EMBOSS) # 浮雕
    26 # img = img.filter(ImageFilter.BLUR) # 模糊,生成噪点
    27 # img = img.filter(ImageFilter.CONTOUR) # 素描
    28 # img = img.filter(ImageFilter.DETAIL) # 锐度
    29 
    30 # 返回像素直方图
    31 # 作用:表示像素值的分布情况
    32 pr = img.histogram()
    33 print(pr)
    34 
    35 # 图片加水印,两张图片合成
    36 img1 = Image.open('img.png')
    37 img.paste(img1, (200, 100))
    38 
    39 img.show()
    40 # jpeg是jpg的全称
    41 img.save('test.jpg','jpeg')

    3. 生成图片验证码

     1 from PIL import Image, ImageDraw, ImageFont
     2 import random
     3 
     4 # 随机字母
     5 def rand_char():
     6     return chr(random.randint(65, 97))
     7 
     8 
     9 # 随机颜色, 前景色
    10 def rand_color1():
    11     return (random.randint(64, 255),
    12             random.randint(64, 255),
    13             random.randint(64, 255))
    14 
    15 
    16 # 背景色
    17 def rand_color2():
    18     return (random.randint(32, 127),
    19             random.randint(32, 127),
    20             random.randint(32, 127),)
    21 
    22 
    23 # 240*60
    24 width = 240
    25 height = 60
    26 # 画板
    27 image = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
    28 
    29 # 创建字体对象
    30 font = ImageFont.truetype(font='arial.ttf', size=36)
    31 # 创建画笔Draw对象
    32 draw = ImageDraw.Draw(image)
    33 # 填充像素
    34 for x in range(width):
    35     for y in range(height):
    36         draw.point((x, y), fill=rand_color1())
    37 
    38 # 写入文字
    39 for i in range(4):
    40     draw.text((60*i+10, 10), text=rand_char(), font=font, fill=rand_color2())
    41 
    42 image.show()
  • 相关阅读:
    MongoDb
    Android中的Parcelable接口和Serializable使用方法和差别
    8.Swift教程翻译系列——控制流之条件
    Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!
    漫谈机器学习经典算法—人工神经网络
    题目1191:矩阵最大值
    HTML中select的option设置selected="selected"无效的解决方式
    HorizontalListView中使用notifyDataSetChanged()和notifyDataSetInvalidated()
    获取Filter的三种途径
    规模化敏捷开发的10个最佳实践(上)
  • 原文地址:https://www.cnblogs.com/cymx66688/p/10957150.html
Copyright © 2011-2022 走看看