【教学类-83-01】20241215立体书三角嘴1.0——小鸡(正菱形嘴)
背景需求:
我想用AI绘画和Python做出立体书三角嘴(小鸡)的图纸
1、通义万相下载小鸡正脸图片
下载后挑选小鸡正脸图片
PS,人工把小鸡嘴巴擦掉,去掉颜色(变成黑白)
动物的嘴巴去掉了。
然后切掉白边,(不要统一大小)
'''
去边后白色地方变成透明色
星火讯飞、阿夏
20240817
'''print('----1、切掉上下左右的白色图层------')import os
from PIL import Imageimport 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,randompath=r'D:\20241122青蛙小鸡\02青蛙'
folder_path = path+r'\01修图'# 留一点白边
white_edge=0
# C:\Users\jg2yXRZ\OneDrive\图片\20240817饮料甜甜圈\甜甜圈白色
import os
from PIL import Imagedef find_non_white_pixel(image):width, height = image.sizeleft, right, top, bottom = width, 0, height, 0for y in range(height):for x in range(width):r, g, b = image.getpixel((x, y))if r != 255 or g != 255 or b != 255:if x < left:left = xif x > right:right = xif y < top:top = yif y > bottom:bottom = yreturn left, right, top, bottomdef crop_image(image, left, right, top, bottom):return image.crop((left-white_edge, top-white_edge, right + white_edge, bottom + white_edge))output_folder = path+r'\02切边图'
os.makedirs(output_folder, exist_ok=True)for file_name in os.listdir(folder_path):if file_name.endswith(".jpg") or file_name.endswith(".png"):input_path = os.path.join(folder_path, file_name)image = Image.open(input_path)left, right, top, bottom = find_non_white_pixel(image)cropped_image = crop_image(image, left, right, top, bottom)output_path = os.path.join(output_folder, file_name)cropped_image.save(output_path)# '''
# 去边后白色地方变成透明色,透明图片统一大小
# 星火讯飞、阿夏
# 20240817
# ''' # print('----2、图片放大成为1024*1024------')
import os
from PIL import Image# path=r'C:\Users\jg2yXRZ\OneDrive\图片\20240817饮料圆形'
# input_folder = path+r'\圆形切边图'
# output_folder = path+r'\圆形切边图透明'# input_folder = path+r'\05切边图'
output_folder =path+r'\02切边图'
# output_folder = path+r'\04透明图'
newput_folder =path+r'\03统一图'
os.makedirs(newput_folder,exist_ok=True)# 提取最大宽度的那张图片的尺寸
def get_max_width_and_height(fold_path):max_width = 0max_height = 0for file_name in os.listdir(fold_path):if file_name.endswith(".png") or file_name.endswith(".jpg") or file_name.endswith(".jpeg"):file_path = os.path.join(fold_path, file_name)img = Image.open(file_path)width, height = img.sizeif width > max_width:max_width = widthmax_height = heightreturn max_width, max_heightfold_path = output_folder
max_width, max_height = get_max_width_and_height(fold_path)
print("最大宽度:", max_width)
print("最大高度:", max_height)
这次不用自动最大的尺寸,原图尺寸切边
切边图
然后把左边的一半图水平翻转复制到右边
# 左右拼图
import os
from PIL import Imagepath=r'D:\20241122青蛙小鸡\02青蛙'
# 定义源文件夹和目标文件夹
source_folder =path+r'\02切边图'
target_folder = path+r'\04拼合图'# 确保目标文件夹存在
if not os.path.exists(target_folder):os.makedirs(target_folder)# 遍历源文件夹中的所有文件
for filename in os.listdir(source_folder):if filename.endswith(('.png', '.jpg', '.jpeg')): # 检查文件扩展名file_path = os.path.join(source_folder, filename)img = Image.open(file_path)width, height = img.size# 计算左半部分的大小left_half = img.crop((0, 0, width // 2, height))# 水平翻转左半部分right_half = left_half.transpose(Image.FLIP_LEFT_RIGHT)# 创建一个新的图像,将右半部分粘贴到左半部分new_img = Image.new('RGB', (width, height))new_img.paste(left_half, (0, 0))new_img.paste(right_half, (width // 2, 0))# 保存新图像到目标文件夹new_filename = os.path.join(target_folder, filename)new_img.save(new_filename)print("所有图片已处理完毕!")
因为动物图片可能不一定完全对称,所以需要复制水平图,确保完全对称
'''
三角嘴立体书第2步-制作拼合动物
星火讯飞:阿夏
20241215
'''
import os
import time
from PIL import Imagepath = r'D:\20241122青蛙小鸡\01小鸡'
# 定义源文件夹和目标文件夹
source_folder = path + r'\02切边图PS修图'
target_folder_left = path + r'\04拼合图左'
target_folder_right = path + r'\04拼合图右'# 确保目标文件夹存在
os.makedirs(target_folder_left, exist_ok=True)
os.makedirs(target_folder_right, exist_ok=True)# 遍历源文件夹中的所有文件 左图复制
for filename in os.listdir(source_folder):if filename.endswith(('.png', '.jpg', '.jpeg')): # 检查文件扩展名file_path = os.path.join(source_folder, filename)img = Image.open(file_path)width, height = img.size# 计算左半部分的大小left_half = img.crop((0, 0, width // 2, height))# 水平翻转左半部分right_half = left_half.transpose(Image.FLIP_LEFT_RIGHT)# 创建一个新的图像,将右半部分粘贴到左半部分new_img = Image.new('RGB', (width, height))new_img.paste(left_half, (0, 0))new_img.paste(right_half, (width // 2, 0))# 保存新图像到目标文件夹new_filename = os.path.join(target_folder_left, filename)new_img.save(new_filename)# 确保最后一张图片关闭img.close()new_img.close()# # 读取每张图片的高度,做成列表,从高到低排序,然后将图片名称重新排序(高到低),数字命名
# # 隐藏,不考虑重新排序了,因为最后我发现即使排序,三角嘴插入的位置还是不能确定正好,需要多次生成人工挑选
# target_folder = target_folder_left# if not os.path.exists(target_folder):
# print(f"文件夹 {target_folder} 不存在")
# else:
# heights_and_filenames = [] # 创建一个空列表来存储高度和文件名
# # 遍历目标文件夹中的所有文件
# for filename in os.listdir(target_folder):
# if filename.endswith(('.png', '.jpg', '.jpeg')): # 检查文件扩展名
# file_path = os.path.join(target_folder, filename)
# img = Image.open(file_path)
# height = img.size[1] # 获取图片高度
# heights_and_filenames.append((height, filename)) # 将高度和文件名添加到列表中
# img.close() # 关闭图像文件# # 按高度从高到低排序
# heights_and_filenames.sort(reverse=True, key=lambda x: x[0])# # 提取排序后的文件名
# sorted_filenames = [filename for height, filename in heights_and_filenames]
# print(heights_and_filenames)
# print(sorted_filenames)
# print(len(sorted_filenames))# # 重命名图片
# for index, filename in enumerate(sorted_filenames, start=0):
# new_filename = f"{index:05}.png" # 生成新的文件名,如001.jpg, 002.jpg等
# old_file_path = os.path.join(target_folder, filename)
# new_file_path = os.path.join(target_folder, new_filename)# # 检查新文件名是否已存在,如果存在则继续递增直到找到一个可用的名称
# while os.path.exists(new_file_path):
# index += 1
# new_filename = f"{index:05}.png"
# new_file_path = os.path.join(target_folder, new_filename)# try:
# os.rename(old_file_path, new_file_path) # 重命名文件
# print(f"重命名 {filename} 为 {new_filename}")
# except PermissionError as e:
# print(f"无法重命名 {filename} 为 {new_filename}: {e}")
# time.sleep(1) # 等待1秒再进行下一个操作# if not os.path.exists(target_folder):
# print(f"文件夹 {target_folder} 不存在")
# else:
# heights_and_filenames = [] # 创建一个空列表来存储高度和文件名
# # 遍历目标文件夹中的所有文件
# for filename in os.listdir(target_folder):
# if filename.endswith(('.png', '.jpg', '.jpeg')): # 检查文件扩展名
# file_path = os.path.join(target_folder, filename)
# img = Image.open(file_path)
# height = img.size[1] # 获取图片高度
# heights_and_filenames.append((height, filename)) # 将高度和文件名添加到列表中
# img.close() # 关闭图像文件# # 按高度从高到低排序
# heights_and_filenames.sort(reverse=True, key=lambda x: x[0])# # 提取排序后的文件名
# sorted_filenames = [filename for height, filename in heights_and_filenames]
# print(heights_and_filenames)
# print(sorted_filenames)
# print(len(sorted_filenames))
# # [(880, '00000.png'), (786, '00001.png'), (780, '00002.png'), (774, '00003.png'), (765, '00004.png'), (732, '00005.png'), (706, '00006.png'), (704, '00007.png'), (699, '00008.png'), (655, '00009.png'), (636, '00010.png'), (632, '00011.png'), (620, '00012.png'), (618, '00013.png'), (612, '00014.png'), (608, '00015.png'), (607, '00016.png'), (607, '00017.png'), (598, '00018.png'), (590, '00019.png'), (583, '00020.png'), (569, '00021.png'), (564, '00022.png'), (563, '00023.png'), (562, '00024.png'), (560, '00025.png'), (554, '00026.png'), (543, '00027.png'), (532, '00028.png'), (520, '00029.png'), (517, '00030.png'), (512, '00031.png'), (494, '00032.png'), (489, '00033.png'), (487, '00034.png'), (485, '00035.png'), (457, '00036.png'), (421, '00037.png'), (415, '00038.png'), (404, '00039.png'), (390, '00040.png'), (371, '00041.png'), (347, '00042.png'), (323, '00043.png'), (298, '00044.png')]# 遍历源文件夹中的所有文件 右一半复制
for filename in os.listdir(source_folder):if filename.endswith(('.png', '.jpg', '.jpeg')): # 检查文件扩展名file_path = os.path.join(source_folder, filename)img = Image.open(file_path)width, height = img.size# 计算右半部分的大小right_half = img.crop((width // 2, 0, width, height))# 水平翻转右半部分left_half = right_half.transpose(Image.FLIP_LEFT_RIGHT)# 创建一个新的图像,将左半部分粘贴到右半部分new_img = Image.new('RGB', (width, height))new_img.paste(left_half, (0, 0))new_img.paste(right_half, (width // 2, 0))# 保存新图像到目标文件夹new_filename = os.path.join(target_folder_right, filename)new_img.save(new_filename)print("所有图片已处理完毕!")
制作左图复制一份、右图复制一份
左图复制(有些眼睛并在一起了)
右图复制(有些没有眼睛,说明下载的图片并不是完全左右对称的)
左右图复制出来的图片还是 有差异的
第三步:在中垂线的随机位置插入小鸡嘴虚线,输入不同参数,反复生成多次。人工筛选图片
举例:小鸡嘴中心点位置在(X=宽一半中心点,Y =200)为例,延伸左右长度100,(嘴缝是200),上三角和下三角的垂线都是100.
'''
三角嘴立体书第3步-添加三角锥,批量生成大量,人工挑选
星火讯飞:阿夏
20241215
'''
import glob,os
from PIL import Image, ImageDraw
path=r'D:\20241122青蛙小鸡\01小鸡'
p=path+r'\04拼合图左'
sorted_filenames= [os.path.join(root, file) for root, dirs, files in os.walk(p) for file in files if file.lower().endswith(('png', 'jpg', 'jpeg', 'gif', 'bmp'))]
# groups = [sorted_filenames[i::3] for i in range(3)]
# print(groups)# 可调参数
# 左右长度
cd=100
# 高度数字越小,越靠顶端
gd=200fin=path+fr'\04拼合图左嘴_长{cd}高{gd}'
os.makedirs(fin,exist_ok=True)# print(len(groups))
for g in range(len(sorted_filenames)):# for h in range(len(groups[g])):# 打开图片image_path = sorted_filenames[g]image = Image.open(image_path)draw = ImageDraw.Draw(image)## 获取图片的宽度和高度width, height = image.size# 第2:画中间虚线# 计算中心线的x坐标center_x = width // 2# 设置虚线的起点和终点start_y = 0 # 向上100像素end_y = height # 向下100像素# 绘制虚线for y in range(start_y, end_y, 40): # 每40像素画一个实线段draw.line((center_x, y, center_x, y+20), fill='black', width=5)# 第2:画剪切的实线# 计算中心线的y坐标# 计算中心线的x坐标center_x = width // 2print(center_x)# 设置水平线的起点和终点start_x = center_x - cd # 向左100像素end_x = center_x + cd # 向右100像素y_position = gd # y坐标为100print(start_x,end_x,y_position)# 绘制水平实线(宽度)draw.line((start_x, y_position, end_x, y_position), fill='black', width=5)# 第3-1:画折叠虚线 (左上)start_x = center_x-cd # 起点x坐标为0start_y = gd # 起点y坐标为图片高度(底部)end_x = center_x # 终点x坐标为图片宽度end_y = gd- cd # 终点y坐标为0(顶部)print(start_x,start_y,end_x,end_y )dx = end_x - start_xdy = end_y - start_ysteps = max(abs(dx), abs(dy)) // 20 # 每20像素画一个实线段# 绘制虚线for i in range(steps):x = start_x + i * dx / stepsy = start_y + i * dy / stepsdraw.line((x, y, x+10, y-10), fill='black', width=5)# 第3-2:画折叠虚线 (左下) # 设置虚线的起点和终点start_x = center_x-cd # 起点x坐标为0start_y = gd # 起点y坐标为图片高度(底部)end_x = center_x # 终点x坐标为图片宽度end_y = gd+ cd # 终点y坐标为0(顶部)print(start_x,start_y,end_x,end_y )# 打印起点和终点坐标print(f"起点坐标: ({start_x}, {start_y})")print(f"终点坐标: ({end_x}, {end_y})")# 计算虚线的步长dx = end_x - start_xdy = end_y - start_ysteps = max(abs(dx), abs(dy)) // 20 # 每20像素画一个实线段# 绘制虚线for i in range(steps ):x = start_x + i * dx / stepsy = start_y + i * dy / stepsdraw.line((x, y, x+10, y+10), fill='black', width=5)# 第3-3:画折叠虚线 (右上) # 设置虚线的起点和终点start_x = center_x # 起点x坐标为0start_y = gd- cd # 起点y坐标为图片高度(底部)end_x = center_x+cd # 终点x坐标为图片宽度end_y = gd # 终点y坐标为0(顶部)print(start_x,start_y,end_x,end_y )# 打印起点和终点坐标print(f"起点坐标: ({start_x}, {start_y})")print(f"终点坐标: ({end_x}, {end_y})")# 计算虚线的步长dx = end_x - start_xdy = end_y - start_ysteps = max(abs(dx), abs(dy)) // 20 # 每20像素画一个实线段# 绘制虚线for i in range(steps ):x = start_x + i * dx / stepsy = start_y + i * dy / stepsdraw.line((x, y, x+10, y+10), fill='black', width=5)# 第3-4:画折叠虚线 (右下)# 终点y坐标为0(顶部)start_x = center_x # 起点x坐标为0start_y =gd+ cd # 起点y坐标为图片高度(底部)end_x = center_x+cd # 终点x坐标为图片宽度end_y = gd # 终点y坐标为0(顶部)print(start_x,start_y,end_x,end_y )dx = end_x - start_xdy = end_y - start_ysteps = max(abs(dx), abs(dy)) // 20 # 每20像素画一个实线段# 绘制虚线for i in range(steps):x = start_x + i * dx / stepsy = start_y + i * dy / stepsdraw.line((x, y, x+10, y-10), fill='black', width=5)# 显示修改后的图片image.save(fin+fr'\{g:05}.png')
虽然输入参数都是长100和高200,但是每张动物原图长宽不同,所以偶尔才能正好有适配的图案,大部分图片都需要删除
现在我做一个遍历,让程序自动生成很多三角嘴,然后手动删除不要的图片
'''
三角嘴立体书第3步-添加三角锥,批量生成大量,人工挑选
星火讯飞:阿夏
20241215
'''
import glob,os
from PIL import Image, ImageDraw
path=r'D:\20241122青蛙小鸡\01小鸡'
p=path+r'\04拼合图左'
sorted_filenames= [os.path.join(root, file) for root, dirs, files in os.walk(p) for file in files if file.lower().endswith(('png', 'jpg', 'jpeg', 'gif', 'bmp'))]
# groups = [sorted_filenames[i::3] for i in range(3)]
# print(groups)# 可调参数
# 左右长度
# cd=100
# # 高度数字越小,越靠顶端
# gd=200
for cd in range(50,250,50):for gd in range(50,540,20):fin=path+fr'\随机\004拼合图左嘴_长{cd}高{gd}'os.makedirs(fin,exist_ok=True)# print(len(groups))for g in range(len(sorted_filenames)):# for h in range(len(groups[g])):# 打开图片image_path = sorted_filenames[g]image = Image.open(image_path)draw = ImageDraw.Draw(image)## 获取图片的宽度和高度width, height = image.size# 第2:画中间虚线# 计算中心线的x坐标center_x = width // 2# 设置虚线的起点和终点start_y = 0 # 向上100像素end_y = height # 向下100像素# 绘制虚线for y in range(start_y, end_y, 40): # 每40像素画一个实线段draw.line((center_x, y, center_x, y+20), fill='black', width=3)# 第2:画剪切的实线# 计算中心线的y坐标# 计算中心线的x坐标center_x = width // 2print(center_x)# 设置水平线的起点和终点start_x = center_x - cd # 向左100像素end_x = center_x + cd # 向右100像素y_position = gd # y坐标为100print(start_x,end_x,y_position)# 绘制水平实线(宽度)draw.line((start_x, y_position, end_x, y_position), fill='black', width=5)# 第3-1:画折叠虚线 (左上)start_x = center_x-cd # 起点x坐标为0start_y = gd # 起点y坐标为图片高度(底部)end_x = center_x # 终点x坐标为图片宽度end_y = gd- cd # 终点y坐标为0(顶部)print(start_x,start_y,end_x,end_y )dx = end_x - start_xdy = end_y - start_ysteps = max(abs(dx), abs(dy)) // 20 # 每20像素画一个实线段# 绘制虚线for i in range(steps):x = start_x + i * dx / stepsy = start_y + i * dy / stepsdraw.line((x, y, x+10, y-10), fill='black', width=3)# 第3-2:画折叠虚线 (左下) # 设置虚线的起点和终点start_x = center_x-cd # 起点x坐标为0start_y = gd # 起点y坐标为图片高度(底部)end_x = center_x # 终点x坐标为图片宽度end_y = gd+ cd # 终点y坐标为0(顶部)print(start_x,start_y,end_x,end_y )# 打印起点和终点坐标print(f"起点坐标: ({start_x}, {start_y})")print(f"终点坐标: ({end_x}, {end_y})")# 计算虚线的步长dx = end_x - start_xdy = end_y - start_ysteps = max(abs(dx), abs(dy)) // 20 # 每20像素画一个实线段# 绘制虚线for i in range(steps ):x = start_x + i * dx / stepsy = start_y + i * dy / stepsdraw.line((x, y, x+10, y+10), fill='black', width=3)# 第3-3:画折叠虚线 (右上) # 设置虚线的起点和终点start_x = center_x # 起点x坐标为0start_y = gd- cd # 起点y坐标为图片高度(底部)end_x = center_x+cd # 终点x坐标为图片宽度end_y = gd # 终点y坐标为0(顶部)print(start_x,start_y,end_x,end_y )# 打印起点和终点坐标print(f"起点坐标: ({start_x}, {start_y})")print(f"终点坐标: ({end_x}, {end_y})")# 计算虚线的步长dx = end_x - start_xdy = end_y - start_ysteps = max(abs(dx), abs(dy)) // 20 # 每20像素画一个实线段# 绘制虚线for i in range(steps ):x = start_x + i * dx / stepsy = start_y + i * dy / stepsdraw.line((x, y, x+10, y+10), fill='black', width=3)# 第3-4:画折叠虚线 (右下)# 终点y坐标为0(顶部)start_x = center_x # 起点x坐标为0start_y =gd+ cd # 起点y坐标为图片高度(底部)end_x = center_x+cd # 终点x坐标为图片宽度end_y = gd # 终点y坐标为0(顶部)print(start_x,start_y,end_x,end_y )dx = end_x - start_xdy = end_y - start_ysteps = max(abs(dx), abs(dy)) // 20 # 每20像素画一个实线段# 绘制虚线for i in range(steps):x = start_x + i * dx / stepsy = start_y + i * dy / stepsdraw.line((x, y, x+10, y-10), fill='black', width=3)# 显示修改后的图片image.save(fin+fr'\{g:05}.png')
以50为例
50,100嘴在头顶上
50,150嘴下移,在眼睛中间
50,200更多嘴巴下移到眼睛中间或眼睛下方
50,250更多图案可以使用
50,300,逐渐下移到小鸡胸口
50,350,逐渐下移到小鸡胸口
50,400,逐渐下移到脚
50,450,逐渐下移,看不见
50,500,逐渐下移,看不见
50,550,逐渐下移,大部分看不见嘴巴了
一共生成40个文件夹
只留了有一张图
100的嘴宽一点
150的嘴宽一点
200的嘴基本不能用
由此可见,左右100-200以内50起步,嘴巴都是正菱形。
换了一个更密集的参数,把它们放到“05随机”文件夹里
为了便于整理,把所有文件夹里的图片提取出来合并在一个文件内,
关键词:读取123文件下所有子文件夹里面的图片,合并在234文件内,如果有重名的,在文件名后面添加数字(递增)
'''
三角嘴立体书第4步-合并所有随机生成的的图片,人工挑选
星火讯飞:阿夏
20241215
'''# Python,读取123文件下所有子文件夹里面的图片,合并在234文件内,如果有重名的,在文件名后面添加数字(递增)
import os
import shutil
path=r'D:\20241122青蛙小鸡\01小鸡'
# 源目录和目标目录
src_directory = path+r'\05随机'
dest_directory = path+r'\06整理'# 确保目标目录存在
if not os.path.exists(dest_directory):os.makedirs(dest_directory)# 遍历源目录下的所有子目录和文件
for root, dirs, files in os.walk(src_directory):for file in files:# 检查文件是否为图片if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):src_file_path = os.path.join(root, file)dest_file_path = os.path.join(dest_directory, file)# 如果目标文件已存在,添加数字后缀counter = 1while os.path.exists(dest_file_path):name, ext = os.path.splitext(file)new_file_name = f"{name}_{counter}{ext}"dest_file_path = os.path.join(dest_directory, new_file_name)counter += 1# 复制文件到目标目录shutil.copy2(src_file_path, dest_file_path)print(f"Copied {src_file_path} to {dest_file_path}")
这种对比更直观高效,只要选出一张满意的图片,其他就可以选中快速删除了
最后整理出一些符合要求的立体书纸模(有的图片会有大中小嘴,建议用中等大小的一款)
一共120个文件夹,每个文件夹大约45张图,不过有些图片太小了,也没有45张,理论5400张,实际5368张
合计5368张
经过漫长的手工筛选,从5368张筛选出82张
有些动物有三种适合的嘴型,有的动物脑袋细,只有一个嘴适合
部分图片修图、删除
给黑眼珠点白色眼睛
同样方法做右侧图拼合的小鸡修图的筛选
大部分图和左边图都一样。筛选出来,与左侧筛出来的图片放在一起,然后比较,筛选
一共有6033图
筛选后127个
右图127张放到左图82张里,如有重名,就保存两个,一共200张
蓝色底是127个右图,继续手工挑选,排除相似的
先修图,画眼珠,去掉不好看的斗鸡眼。然后对比筛选
留下了134张
制作模版
代码展示
# '''# 目的:134张小鸡变成PDF
# 作者:阿夏
# 时间:2024年12月15日17:27
# '''import os
import time
import shutil
from docx import Document
from docx.shared import Cm, Pt, Inches, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from PyPDF2 import PdfFileMerger, PdfFileReader
from docxtpl import DocxTemplate
import pandas as pd
import os
from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
import time
from PIL import Imageprint('----------第1步:提取所有的幼儿照片的路径------------')# 读取123文件夹下的所有图片
path = r'D:\20241122青蛙小鸡'
path1=path+r'\01小鸡'
folder= os.path.join(path1, '07筛选') # 100folder_files = [os.path.join(folder, f) for f in os.listdir(folder) if f.endswith('.jpg') or f.endswith('.png')]
# print(folder_files)# 创建临时文件夹
new_folder = path+r'\零时文件夹'
os.makedirs(new_folder, exist_ok=True)print('----------第3步:一张大茶壶,2个小茶杯 ------------')for nn in range(0,int(len(folder_files))): # 读取图片的全路径 的数量 31张doc = Document(path+r'\立体书三角嘴.docx')folder_figures=folder_files[nn] # 茶杯的图片table = doc.tables[0] # 4567(8)行
## # 打开图片并检查宽度# with Image.open(folder_figures) as img:# width, height = img.size# # 计算新宽度# desired_height = 14.1 # 目标高度为14.1厘米# new_width = width * (desired_height / height)# print(f"Original width: {width}, Original height: {height}, New width: {new_width}")# if width > 19.76:# print(f"Skipping image {folder_figures} due to width {width}cm")# continue# else: # 写入1张大图run = doc.tables[0].cell(1, 0).paragraphs[0].add_run() # 图片位置 第一个表格的0 3 插入照片run.add_picture(r'{}'.format(folder_figures), height=Cm(14.1))table.cell(1, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 居中# 保存文档doc.save(os.path.join(new_folder, fr'{nn:03d}.docx'))print('----------第4步:把都有PDF合并为一个打印用PDF------------')# 将10个docx转为PDF
import os
from docx2pdf import convert
from PyPDF2 import PdfFileMergerpdf_output_path = path+fr"\小鸡立体书三角嘴({len(folder_files)}人共{len(folder_files)}份).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(zheng_path)
# shutil.rmtree(fan_path)
time.sleep(10)
作品展示
其他说明:需要消除黑线
又一次手动把134张图右侧的位置打了白色
再次生成,所有图片右侧都没有黑线
但是相似图片太多(嘴的大小差异)
所以用打乱程序,减少连续重样图案出现。
乱序排列代码
# '''# 目的:134张小鸡变成PDF(乱序)
# 作者:阿夏
# 时间:2024年12月15日17:27
# '''import os
import time
import shutil
from docx import Document
from docx.shared import Cm, Pt, Inches, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from PyPDF2 import PdfFileMerger, PdfFileReader
from docxtpl import DocxTemplate
import pandas as pd
import os,random
from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
import time
from PIL import Imageprint('----------第1步:提取所有的幼儿照片的路径------------')# 读取123文件夹下的所有图片
path = r'D:\20241122青蛙小鸡'
path1=path+r'\01小鸡'
folder= os.path.join(path1, '07筛选') # 100folder_files = [os.path.join(folder, f) for f in os.listdir(folder) if f.endswith('.jpg') or f.endswith('.png')]
folder_files = random.sample(folder_files, len(folder_files))
# print(folder_files)# 创建临时文件夹
new_folder = path+r'\零时文件夹'
os.makedirs(new_folder, exist_ok=True)print('----------第3步:一张大茶壶,2个小茶杯 ------------')for nn in range(0,int(len(folder_files))): # 读取图片的全路径 的数量 31张doc = Document(path+r'\立体书三角嘴.docx')folder_figures=folder_files[nn] # 茶杯的图片table = doc.tables[0] # 4567(8)行
## # 打开图片并检查宽度# with Image.open(folder_figures) as img:# width, height = img.size# # 计算新宽度# desired_height = 14.1 # 目标高度为14.1厘米# new_width = width * (desired_height / height)# print(f"Original width: {width}, Original height: {height}, New width: {new_width}")# if width > 19.76:# print(f"Skipping image {folder_figures} due to width {width}cm")# continue# else: # 写入1张大图run = doc.tables[0].cell(1, 0).paragraphs[0].add_run() # 图片位置 第一个表格的0 3 插入照片run.add_picture(r'{}'.format(folder_figures), height=Cm(14.1))table.cell(1, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 居中# 保存文档doc.save(os.path.join(new_folder, fr'{nn:03d}.docx'))print('----------第4步:把都有PDF合并为一个打印用PDF------------')# 将10个docx转为PDF
import os
from docx2pdf import convert
from PyPDF2 import PdfFileMergerpdf_output_path = path+fr"\小鸡立体书三角嘴乱序({len(folder_files)}人共{len(folder_files)}份).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(zheng_path)
# shutil.rmtree(fan_path)
time.sleep(10)