心妍 发表于 2022-11-1 20:09:17

利用PIL模块操作图像及生成验证码

                                                                              不成熟的个人思路


一些废话

# -------------------------------------------------------------------------------------------------------------------

# 关于要不要赋值给变量以及方法要不要带括号以及需不需要传递参数到方法的括号中 要视情况而定
# 不知道我这样理解对不对 如果调用方法有返回值 那么就需要赋值 如果返回值为None 那么就不需要赋值
# 方法带括号主要是为了传递参数 如果需要传递参数 方法就要带括号 反之 一般不需要传递参数
# 这也是困扰了我许久的问题 自己尝试给出的见解 不知道对不对 如果各位大神有好的见解 欢迎指出

# -------------------------------------------------------------------------------------------------------------------


操作图像
# 在cmd中输入 pip install pillow
# 查看是否安装 已经安装pillow的话会输出英文提示WARNING: You are using pip version 21.2.4; however, version 22.3 is available. 没有的话就会进行下载
# 进行图像操作 PIL已经是python平台事实上的图像处理标准库 所以先从PIL导入Image

from PIL import Image

# 注意是当前路径 路径前加r 让后面的路径保持原始含义 打开图像文件用Image.open()方法 括号里面传入原始含义的图像绝对路径 该方法返回一个图像对象
# 猜测 Image.open()方法返回的应该不是原始图像 而是复制过后的图像 也就是对原始图像进行复制的副本
img = Image.open(r"C:\Users\33943\Downloads\c2e79316825b93c8b8c03cc8fe229e6c.jpeg")                # 绝对路径 可以自己去下载图片 替换成下载图片绝对路径

# 获取图像的尺寸 用size
# 对img对象使用size方法 并赋值给变量w,h
w,h = img.size

# 输出图像的大小
print('原始图像大小为 %sx%s' %(w,h))

# 缩放图像至原来的一半 没看官网文档 我猜测thumbnail()方法可以对图像进行放大和缩小 thumbnail()里面传入一个元组 元组里面是修改宽和高的表达式
img.thumbnail((w//2,h//2))
print('修改图像大小至 %sx%s' %(w//2,h//2))

# 保存图像 注意会保留到cmd的目录下 我这里是这样的 第一个参数填文件名,第二个参数填图像格式 好像不能填jpg 要填jpeg
# 这里不是直接对原始图像修改保存 我猜测 应该是复制了原始图像到内存中 然后对复制的那张图片进行修改操作

img.save('植物.jpg','jpeg')

对图像进行模糊处理
from PIL import Image, ImageFilter

# 先用Image.open()方法打开一个jpeg格式的图像文件
img2 = Image.open(r"C:\Users\33943\Downloads\c2e79316825b93c8b8c03cc8fe229e6c.jpeg")

# 对img2对象使用filter()方法 没看介绍 不知道这个filter()方法以及里面的参数有什么用
img2 = img2.filter(ImageFilter.BLUR)

# 显示图像
img2.show()
# 保存经过模糊处理过后的图像 用save()方法 里面第一个参数填文件名(包括后缀名) 第二个参数填jpeg
img2.save('模糊图像.jpg','jpeg')

生成随机验证码图片
# 导入相关的模块

# Image模块应该是读取图像, ImageDraw应该是绘制图像,ImageFont应该是创建字体对象, 后面的ImageFilter我不知道意思 但是 img.filter(ImageFilter.BLUR)方法可以对图像进行模糊处理
from PIL import Image, ImageDraw, ImageFont, ImageFilter

# 生成随机字母 先导入随机模块
import random
def rdChr():
    # 先生成一个范围在range(0,255)的随机整数 然后用chr()方法 chr()方法里面是一个整数 chr()方法通过一个整数生成对应的字母
    return chr(random.randint(65,90))

# 生成随机颜色
def rdColor1():
    return (random.randint(64,255),random.randint(64,255),random.randint(64,255))

# 和上面的函数功能一样 有一点奇怪 就是下面的这个函数中的random.randint()的参数差不多是上面的函数中的参数值的一半
def rdColor2():
    return (random.randint(32,127),random.randint(32,127),random.randint(32,127))

# 定义宽和高我记忆中的纯字母验证码图片 类似横屏 像个横放的手机 所以width应该为heigh的n倍
width = 60 * 4
height = 80

# 创建图像
# Image.new()方法返回一个创建的图像 宽和高为320*80 背景色为白色的图像
image1 = Image.new('RGB',(width,height),(255,255,255))

# 里面的字体路径传入一个字体文件的绝对路径 要不然 可能会报错 第二个参数填字号
font = ImageFont.truetype('C:\Windows\Fonts\Arial.ttf',50)

# 创建Draw对象 虽然并不明白这段代码的意思 但是我猜测 只有创建Draw对象才能对图像进行编辑
draw = ImageDraw.Draw(image1)

# 下面的两段代码完全看不懂 我猜测第一段代码应该是对每个图像的像素块填充颜色 填充的颜色是随机的
for x in range(width):
    for y in range(height):
      draw.point((x, y), fill=rdColor1())

# 猜测生成字母 生成四个字母 字母也被填充颜色
# 输出文字:
for t in range(4):
    draw.text((60 * t + 10, 10), rdChr(), font=font, fill=rdColor2())


# 对生成的验证码图像进行模糊处理

image1.filter(ImageFilter.BLUR)

# 保存图像到cmd目录下

image1.save('字母验证码.jpg','jpeg')


心妍 发表于 2022-11-1 20:10:38

利用PIL模块操作图像及生成验证码 https://www.52pojie.cn/thread-1706738-1-1.html (出处: 吾爱破解论坛)

乐活 发表于 2022-11-2 08:54:21

过来学习,多谢!

心妍 发表于 2022-11-2 10:05:00

乐活 发表于 2022-11-2 08:54
过来学习,多谢!

嘿嘿嘿{:lol:}

onhawk 发表于 2022-11-4 09:06:11

谢谢分享,支持

心妍 发表于 2022-11-4 09:09:15

onhawk 发表于 2022-11-4 09:06
谢谢分享,支持

不用谢 嘿嘿{:4_266:}
页: [1]
查看完整版本: 利用PIL模块操作图像及生成验证码