mirror of
https://github.com/taisuii/ClassificationCaptchaOcr.git
synced 2026-03-18 07:03:17 +08:00
75 lines
2.2 KiB
Python
75 lines
2.2 KiB
Python
from PIL import Image, ImageFont, ImageDraw, ImageOps
|
|
from io import BytesIO
|
|
|
|
|
|
def convert_png_to_jpg(png_bytes: bytes) -> bytes:
|
|
# 将传入的 bytes 转换为图像对象
|
|
png_image = Image.open(BytesIO(png_bytes))
|
|
|
|
# 创建一个 BytesIO 对象,用于存储输出的 JPG 数据
|
|
output_bytes = BytesIO()
|
|
|
|
# 检查图像是否具有透明度通道 (RGBA)
|
|
if png_image.mode == 'RGBA':
|
|
# 创建白色背景
|
|
white_bg = Image.new("RGB", png_image.size, (255, 255, 255))
|
|
# 将 PNG 图像粘贴到白色背景上,透明部分用白色填充
|
|
white_bg.paste(png_image, (0, 0), png_image)
|
|
jpg_image = white_bg
|
|
else:
|
|
# 如果图像没有透明度,直接转换为 RGB 模式
|
|
jpg_image = png_image.convert("RGB")
|
|
|
|
# 将转换后的图像保存为 JPG 格式到 BytesIO 对象
|
|
jpg_image.save(output_bytes, format="JPEG")
|
|
|
|
# 返回保存后的 JPG 图像的 bytes
|
|
return output_bytes.getvalue()
|
|
|
|
|
|
def crop_image(image_bytes, coordinates):
|
|
img = Image.open(BytesIO(image_bytes))
|
|
width, height = img.size
|
|
grid_width = width // 3
|
|
grid_height = height // 3
|
|
cropped_images = []
|
|
for coord in coordinates:
|
|
y, x = coord
|
|
left = (x - 1) * grid_width
|
|
upper = (y - 1) * grid_height
|
|
right = left + grid_width
|
|
lower = upper + grid_height
|
|
box = (left, upper, right, lower)
|
|
cropped_img = img.crop(box)
|
|
cropped_images.append(cropped_img)
|
|
return cropped_images
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# 切割顺序,这里是从左到右,从上到下[x,y]
|
|
coordinates = [
|
|
[1, 1],
|
|
[1, 2],
|
|
[1, 3],
|
|
[2, 1],
|
|
[2, 2],
|
|
[2, 3],
|
|
[3, 1],
|
|
[3, 2],
|
|
[3, 3],
|
|
]
|
|
with open("./image_test/bg.jpg", "rb") as rb:
|
|
bg_img = rb.read()
|
|
cropped_images = crop_image(bg_img, coordinates)
|
|
# 一个个保存下来
|
|
for j, img_crop in enumerate(cropped_images):
|
|
img_crop.save(f"./image_test/bg{j}.jpg")
|
|
|
|
# 图标格式转换
|
|
with open("./image_test/icon.png", "rb") as rb:
|
|
icon_img = rb.read()
|
|
icon_img_jpg = convert_png_to_jpg(icon_img)
|
|
with open("./image_test/icon.jpg", "wb") as wb:
|
|
wb.write(icon_img_jpg)
|