背景需求
我想给孩子们做一个小圆镜,花边涂色,打洞,做一个项链样式
1、使用通义万相生成了“圆形镜子,有花边”
边缘细,黑色面积大的图片放到另外一个文件夹里(不用)
从性价比角度,购买0,49元一个的5CM直径镜片
挑选出一些边缘宽的图片
用代码测试这些图片中的空白圆形是不是5CM
结果,红色的圈都比图片里的空白圆小,也就是生成的图片内部的白色圆都超过了直径5CM。
偶尔有几个符合要求,数量太少
所以我重新用“通义万相”生成没有空心的圆形花纹
圆形花纹,没有空心,简单笔画,卡通,黑白,未着色,幼儿插图,线条画,没有背景,没有颜色,黑白漫画线条艺术:,空背景,粗轮廓,清晰的线条,矢量线。简单,大,
下载图片
图片上加上4.5CM直径的空白圆形。
用红色线测定一下范围
在Word里面测一下直径大小(红色4.5CM、黄色5CM)
删除白圆比用圆大的图片
经过筛选后(5CM圆形)
这些是剔除的
然后设计代码,将满格圆形花纹图上分别添加
白色圆形(正面镂空)
白色正方形(反面衬底写名字)。
用代码组合在一起。
模板样式
代码展示:
'''
花边圆镜
星火讯飞、通义万相 阿夏
2024年7月22日
'''
import os
from PIL import Image, ImageDraw
import os,time
import shutil
from docx import Document
from docx.shared import Cm
from PIL import Image
from PyPDF2 import PdfFileMerger, PdfFileReaderfrom PIL import Image, ImageDraw, ImageFont
import os,randomprint('-----1、测试镜子5CM直径,覆盖一个4.5CM的黑线白填充圆形和一个4CM的正方形--------')
def draw_circle(image_path, output_path):# 打开图片image = Image.open(image_path)width, height = image.size# 计算中心点center_x = width // 2center_y = height // 2# 创建一个ImageDraw对象draw = ImageDraw.Draw(image)# 设置圆的半径(假设每像素代表1CM)dpi=2400radius = int(2.25 * 110) # 转换为像素print(radius)# 画一个红色的圆形draw.ellipse((center_x - radius, center_y - radius, center_x + radius, center_y + radius), outline="black",fill='white', width=10)# 保存图片image.save(output_path)def draw_square(image_path, output_path):# 打开图片image = Image.open(image_path)width, height = image.size# 计算中心点center_x = width // 2center_y = height // 2# 创建一个ImageDraw对象draw = ImageDraw.Draw(image)# 添加正方形square_size = int(3 * 110) # 转换为像素draw.rectangle((center_x - square_size // 2, center_y - square_size // 2, center_x + square_size // 2, center_y + square_size // 2), outline="black", fill="white",width=10)# 保存图片image.save(output_path)# 获取123文件夹下的所有图片文件
path=r'C:\Users\jg2yXRZ\OneDrive\桌面\20240722圆形花纹自制'
folder_path =path+r"\02筛选图"
zheng_path=path+r"\03测试圆正面"
fan_path=path+r"\04测试圆反面"os.makedirs(zheng_path,exist_ok=True)
os.makedirs(fan_path,exist_ok=True)image_files = [f for f in os.listdir(folder_path) if f.endswith(('.jpg', '.jpeg', '.png'))]# 遍历所有图片文件,处理并保存圆形和正方形分别保存在两个文件夹里
for image_file in image_files:input_path = os.path.join(folder_path, image_file)output_path_circle = os.path.join(zheng_path, image_file)output_path_square = os.path.join(fan_path, image_file)draw_circle(input_path, output_path_circle)draw_square(input_path, output_path_square)
# print(zheng_path)# print('----2、读取两个图,分别插入docx,制作PDF---------')zheng_files = [f for f in os.listdir(zheng_path) if f.endswith('.jpg') or f.endswith('.png')]
fan_files = [f for f in os.listdir(fan_path) if f.endswith('.jpg') or f.endswith('.png')]# 正面图与反面图一一组合
image_files_all=[]
for i in range(len(zheng_files)):image_files_all.append(os.path.join(zheng_path, zheng_files[i]))image_files_all.append(os.path.join(fan_path, fan_files[i]))
print(image_files_all)# 将图片拆成6个一组
grouped_files = [image_files_all[i:i + 6] for i in range(0, len(image_files_all), 6)]
print(len(grouped_files))
# 53# 创建临时文件夹
new_folder = path+r'\零时文件夹'
os.makedirs(new_folder, exist_ok=True)# 处理每一组图片
for group_index, group in enumerate(grouped_files):print(group)# 创建新的Word文档doc = Document(path+r'\圆镜模版.docx')# print(group)# 遍历每个单元格,并插入图片for cell_index, image_file in enumerate(group):# 计算图片长宽(单位:厘米)print(image_file)# 插入图片到单元格table = doc.tables[0]cell = table.cell(int(cell_index / 2), cell_index % 2)# 如果第一行有4个格子,两个数字都写4cell_paragraph = cell.paragraphs[0]cell_paragraph.clear()run = cell_paragraph.add_run()run.add_picture(image_file, width=Cm(9.4), height=Cm(9.4))# 保存Word文档doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))# 将10个docx转为PDF
import os
from docx2pdf import convert
from PyPDF2 import PdfFileMergerpdf_output_path = path+fr'\\圆镜{int(len(zheng_path))}张共{len(zheng_path)}图.pdf'# 将所有DOCX文件转换为PDF
for docx_file in os.listdir(new_folder):if docx_file.endswith('.docx'):docx_path = os.path.join(new_folder, docx_file)convert(docx_path, docx_path.replace('.docx', '.pdf'))# 合并零时文件里所有PDF文件
merger = PdfFileMerger()
for pdf_file in os.listdir(new_folder):if pdf_file.endswith('.pdf'):pdf_path = os.path.join(new_folder, pdf_file)merger.append(pdf_path)
time.sleep(2)# 保存合并后的PDF文件
merger.write(pdf_output_path)
merger.close()# 删除输出文件夹shutil.rmtree(new_folder)
# shutil.rmtree(zhang_path)
# shutil.rmtree(fan_path)
time.sleep(2)
一张有3组圆镜(横向2个为一套,左边是正面(白色圆形镂空装镜子,右边是反面,花纹对外面,白色正方形写名字)