Task-1

你有⼀个⽬录,装了很多照⽚,把它们的尺⼨变成都不⼤于 iPhone5 分辨率的⼤⼩。

Task-2

你有⼀个⽬录,现在需要在⾥⾯⽣成100张验证码各不相同的图⽚。⽂件名就是他的验证码,并且⽣成⼀个fliename.lst

Solution-1

解题思路:

  1. 遍历所有图片.
  2. 按比例缩放图片.
  3. 保存图片.

确定目标:

  1. iPhone5 分辨率为 640x1136.
  2. 需要的库为 os(文件读取) 和 PIL(图像处理).

查文档:

Notes.
另外还查到了 Image.ANTIALIAS(抗锯齿) 这个参数已经弃用了.

实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from PIL import Image
import os

# 设置目标分辨率
target_resolution = (640, 1136)

def resize_image(input_path, output_path):
# 打开图片
image = Image.open(input_path)
# 调整图片大小,保持比例
image.thumbnail(target_resolution, Image.LANCZOS)
# 保存调整后的图片
image.save(output_path)

def resize_images(folder_path, target_path=None):
if target_path is None:
# 目标文件夹默认为 `folder_path`
target_path = folder_path
# 遍历文件夹中的所有文件
for file_name in os.listdir(folder_path):
# 构建完整的文件路径
file_path = os.path.join(folder_path, file_name)
# 检查是否为文件
if os.path.isfile(file_path):
# 分离文件名和扩展名
name, ext = os.path.splitext(file_name)
# 支持的图片格式
if ext.lower() in ['.jpg', '.jpeg', '.png', '.bmp', '.gif']:
# 设置输出文件的路径
output_path = os.path.join(folder_path, f"{name}_resized{ext}")
# 调整图片大小
resize_image(file_path, output_path)
print(f"图片 {file_name} 已调整大小并保存为 {output_path}")

# 调用函数,'folder_path'是包含图片的文件夹路径
resize_images('folder_path')

另外, 顺便查了一下两个API的差别:
在Pillow库中,image.thumbnail()image.resize() 方法都用于调整图片的大小,但它们之间有一些关键的区别:

  1. 保持比例image.thumbnail() 方法会保持图片的原始宽高比例,而 image.resize() 可以改变图片的宽高比。
  2. 目标尺寸image.thumbnail() 方法会将图片缩小到指定的最大尺寸内,但不会放大图片。如果原始图片的尺寸小于或等于目标尺寸,那么图片不会被改变。而 image.resize() 方法则会直接将图片调整到指定的尺寸,无论它是放大还是缩小。
  3. 就地修改image.thumbnail() 方法会直接修改原始图片对象,不返回新的图片对象。相反,image.resize() 方法会返回一个新的图片对象,原始图片对象不会被修改。

因此,如果你想要保持图片的原始宽高比并确保图片不会被放大,应该使用 image.thumbnail()。如果你需要将图片调整到特定的尺寸,并且不介意改变宽高比或放大图片,那么使用 image.resize() 会更合适。

Solution-2

解题思路:

  1. 确定目标文件夹.
  2. 生成验证码图片.
  3. 保存验证码名称.

解法-1

运用专门的第三方库生成.

需要的库:

  • captcha - 一个生产验证码的库.
  • string - Python内置的字符串库.
  • random - Python内置的随机数库.
  • os - Python内置的操作系统接口库.

这个库的示例代码:

1
2
3
4
5
6
7
8
9
10
11
from captcha.audio import AudioCaptcha
from captcha.image import ImageCaptcha

audio = AudioCaptcha(voicedir='/path/to/voices')
image = ImageCaptcha(fonts=['/path/A.ttf', '/path/B.ttf'])

data = audio.generate('1234')
audio.write('1234', 'out.wav')

data = image.generate('1234')
image.write('1234', 'out.png')

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from captcha.image import ImageCaptcha
import random
import string
import os

# 创建一个ImageCaptcha实例
image = ImageCaptcha(width=280, height=90)

# 指定保存验证码图片的目录
output_dir = 'test_dir'
if not os.path.exists(output_dir):
os.makedirs(output_dir)

# 创建并打开filename.lst文件
with open(os.path.join(output_dir, 'filename.lst'), 'w') as f:
# 生成100张验证码图片
for i in range(100):
# 生成随机的四位验证码
captcha_text = ''.join(random.choices(string.ascii_uppercase + string.digits, k=4))
# 生成验证码图片
data = image.generate(captcha_text)
# 构建图片文件名
file_name = f"{captcha_text}.png"
# 保存验证码图片
image.write(captcha_text, os.path.join(output_dir, file_name))
# 将文件名写入filename.lst
f.write(file_name + '\n')

print(f"100张验证码图片已生成在{output_dir}目录中,并且文件名已记录在filename.lst文件中。")

注意别把这个python代码文件名给命名成captcha了hhh

解法-2

pillow 自己实现验证码的生成.

以下是一个简单的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
import string
import os

# 设置验证码图片的大小
width, height = 160, 60
# 设置字体大小
font_size = 36

# 生成随机字符串作为验证码
def generate_captcha_text(length=4):
return ''.join(random.choices(string.ascii_uppercase + string.digits, k=length))

# 添加干扰线
def add_noise(draw):
for _ in range(random.randint(1, 3)): # 线条数量
start = (random.randint(0, width), random.randint(0, height))
end = (random.randint(0, width), random.randint(0, height))
draw.line([start, end], fill=(0, 0, 0), width=2)

# 添加噪点
def add_noise_dots(draw):
for _ in range(random.randint(100, 200)): # 噪点数量
xy = (random.randint(0, width), random.randint(0, height))
draw.point(xy, fill=(0, 0, 0))

# 生成验证码图片
def generate_captcha_image(text):
# 创建一个新的图片对象
image = Image.new('RGB', (width, height), (255, 255, 255))
# 创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(image)
# 设置字体(使用默认字体)
font = ImageFont.truetype("arial.ttf", size=font_size)
# 在图片上绘制文本
draw.text((10, 5), text, font=font, fill=(0, 0, 0))
# 添加干扰线
add_noise(draw)
# 添加噪点
add_noise_dots(draw)
# 应用滤镜
image = image.filter(ImageFilter.GaussianBlur(1))

return image

# 主函数
def main(output_dir, number_of_captchas=100):
# 确保输出目录存在
if not os.path.exists(output_dir):
os.makedirs(output_dir)

# 创建并打开filename.lst文件
with open(os.path.join(output_dir, 'filename.lst'), 'w') as f:
for _ in range(number_of_captchas):
# 生成验证码文本
captcha_text = generate_captcha_text()
# 生成验证码图片
captcha_image = generate_captcha_image(captcha_text)
# 构建图片文件名
file_name = f"{captcha_text}.png"
# 保存验证码图片
captcha_image.save(os.path.join(output_dir, file_name))
# 将文件名写入filename.lst
f.write(file_name + '\n')

# 调用主函数
if __name__ == '__main__':
main('test_dir')
print("Captcha images and filenames have been generated.")