
背景说明
前期做了几套凹凸拼图的模版,包含小拼图(前面图案,后面数字)参考图(前面灰色后面白色)
【教学类-34-12】20250509(通义万相)4*3蝴蝶拼图(圆形、三角、正方、半圆的凹凸小块+数字提示+参考图灰色)-CSDN博客文章浏览阅读1.1k次,点赞41次,收藏7次。【教学类-34-12】20250509(通义万相)4*3蝴蝶拼图(圆形、三角、正方、半圆的凹凸小块+数字提示+参考图灰色)
https://blog.csdn.net/reasonsummer/article/details/147835883?spm=1011.2415.3001.5331
但是根据实操结果
【办公类-39-06】20250507批量生成通义万相图片(六)彩色背景蝴蝶(通义万相:Python自动生成图片+Python自动下载图片+Python筛选无白色的图片+集体裁剪)-CSDN博客文章浏览阅读1k次,点赞17次,收藏6次。【办公类-39-06】20250507批量生成通义万相图片(六)彩色背景蝴蝶(通义万相:Python自动生成图片+Python自动下载图片+Python筛选无白色的图片+集体裁剪)
https://blog.csdn.net/reasonsummer/article/details/147749779?spm=1011.2415.3001.5331
1、幼儿很难剪得完美(四轮加工修剪白色、有些凹凸口剪的变形)
2、裁剪过程中有遗失拼图块(48块少了2块)
3、参考图只有灰色底,最好彩色和灰色都有。
背景需求
因此我希望增加一套教师裁剪的拼图作为备用,并在灰色参考图背后打印彩色参考图

前期已经设计了圆形凹凸(有教师和幼儿、参考图)
问AI合并代码



四款合并代码(遍历,四款样式都做1份,测试前后是否能对齐)

'''
目的:3*4彩色拼图(可选择圆形/三角形/半圆形/正方形凹凸)
1.凹凸小拼图+背面数字编号(幼儿剪)
2.连一起的彩色拼图+背面数字编号(教师剪)
3.正方面:灰色参考图(凹凸黑色线)+彩色参考图(原图无凹凸线,插入WORD,
4.圆形凹凸比其他三款小,所以小拼图和参考图都有两套尺寸
作者:deepseek,阿夏
时间:20250510
'''
import os
import time
import random
from PIL import Image, ImageDraw, ImageEnhance, ImageFont
from docx import Document
from docx.shared import Cm, Pt
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docx2pdf import convert
from PyPDF2 import PdfMerger
import shutil
import math
for zz in range(1,5):
# 配置参数
sj = 1 # 1:顺序插入 2:乱序
shape_type = zz # 1:圆形凹凸 2:三角形凹凸 3:半圆形凹凸 4:正方形凹凸
yangshi = 0.56 # 凹凸形状参数
wide = 3 # 行数
high = 4 # 列数
Number = wide * high
border_width = 5 # 边框宽度
# 半圆形参数
circle_radius = 130 # 半圆半径(像素)
circle_offset = 0 # 凹凸偏移量(像素)
protrusion_prob = 0.5 # 凹凸密度(0-1之间)
# 正方形参数
square_size = 50 # 正方形凹凸的大小(像素)
square_offset = -10 # 凹凸的偏移量(像素)
# 路径设置
path = r'D:\20250506彩色蝴蝶无白色'
prz = os.path.join(path, "01图片")
pathz = [os.path.join(prz, f) for f in os.listdir(prz) if f.endswith(".png")]
print(f"找到{len(pathz)}张原始图片")
# 画布尺寸配置
canvas_width = 2830 # 画布宽度
canvas_height = 1950 # 画布高度
cell_width = canvas_width // high
cell_height = canvas_height // wide
def convert_to_light_gray(image):
"""将图像转为浅灰色(保留透明度)"""
gray = image.convert('L')
enhancer = ImageEnhance.Brightness(gray)
light_gray = enhancer.enhance(1.9)
return Image.merge('RGBA', (light_gray, light_gray, light_gray, image.split()[3]))
def draw_border_on_edge(img, border_width=5):
"""在透明与非透明交界处绘制黑色实线"""
img = img.convert("RGBA")
width, height = img.size
draw = ImageDraw.Draw(img)
pixels = img.load()
edge_map = set()
for x in range(width):
for y in range(height):
if pixels[x, y][3] > 0:
for dx, dy in [(-1,0),(1,0),(0,-1),(0,1)]:
nx, ny = x + dx, y + dy
if 0 <= nx < width and 0 <= ny < height:
if pixels[nx, ny][3] == 0:
edge_map.add((x, y))
break
for x, y in edge_map:
for i in range(max(0, x-border_width//2), min(width, x+border_width//2+1)):
for j in range(max(0, y-border_width//2), min(height, y+border_width//2+1)):
if (i - x)**2 + (j - y)**2 <= (border_width//2)**2:
draw.point((i, j), fill=(0, 0, 0, 255))
return img
def SplitImages(img_path, row, col):
"""分割原始图片为row×col的小图"""
img = Image.open(img_path).convert("RGBA")
imgSize = img.size
splitW = int(imgSize[0]/col)
splitL = int(imgSize[1]/row)
pimg = img.load()
imbList = []
for i in range(row):
rowList = []
for j in range(col):
imb = Image.new('RGBA', (splitW, splitL), (255,255,255,0))
pimb = imb.load()
for k in range(j * splitW, (j + 1) * splitW):
for z in range(i * splitL, (i + 1) * splitL):
pimb[k - j * splitW, z - i * splitL] = pimg[k,z]
rowList.append(imb)
imbList.append(rowList)
return imbList
def Resize(img, rizeW, rizel, pastePoint=None):
"""调整图像大小"""
if pastePoint is None:
pastePoint = [0, 0]
new_im = Image.new('RGBA', [rizeW, rizel], (255,255,255,0))
new_im.paste(img, pastePoint)
return new_im
def point_in_triangle(pt, triangle):
"""判断点是否在三角形内"""
def sign(p1, p2, p3):
return (p1[0] - p3[0])*(p2[1] - p3[1]) - (p2[0] - p3[0])*(p1[1] - p3[1])
b1 = sign(pt, triangle[0], tria