背景需求:
制作小鸡立体贺卡三角嘴,它的嘴是正菱形(四条边长度相等,类似正方形)
第二种是青蛙,嘴巴要更狭长一些(角度不是45度)
用以上的数值测试后,发现虚线存在问题。
通过反复测试,终于找到成因
1、再做垂线高度的设置(变化的,30磅到120磅之间的移动)
2、修改Y轴坐标数,同时把尺的比例从1:2,变成1:5
效果:
我想用AI绘画和Python做出立体书三角嘴(青蛙)的图纸
1、通义万相下载青蛙正脸图片
卡通简笔画,白色背景,青蛙,全身像,正面对称造型,正面对称造型,正面对称造型黑白轮廓线,无着色,简单,可爱,矢量图,大。尖尖嘴,没有颜色
下载后挑选青蛙正脸图片
PS,人工把青蛙嘴巴擦掉,去掉颜色(变成黑白)
动物的嘴巴去掉了。
2、修图,把白色背景变成红色
我想把青蛙图片背景变成用PS批量填充为红色,然后切掉红色空边(图片变小),红色再转成透明,便于最后把青蛙与池塘背景图重叠。
以下是UIBOT+PS自动填充背景红色的录像
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="wLxoHIoW-1734356704241" src="https://live.csdn.net/v/embed/439141"></iframe>20241216IIBOT+PS填充背景红色
'''UIBOT 6.0'''
Dim arrayRet,iRet,图片名,iPID,temp
Rem 把输入法改成英文键盘
iPID=App.Start('''C:\Program Files\Adobe\Adobe Photoshop CS6 (64 Bit)\Photoshop.exe''', 1, 3)
Delay(10000)
地址 = '''D:\20241122青蛙小鸡\02青蛙\01修图红色'''
文件名=File.DirFileOrFolder(地址,"file",{"hasPath":true})
TracePrint(文件名)
张=UBound(文件名)
TracePrint(张)
Mouse.Move(8, 625, false,{"iDelayAfter": 300, "iDelayBefore": 200})
Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
Mouse.Move(27, 623, false,{"iDelayAfter": 300, "iDelayBefore": 200})
Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
取色点坐标 = [500,220] //正方1:1
// 取色点坐标 = [830,554]// 正方1:1中心白色
// 取色点坐标 = [230,210]// 正方16:9
// 取色点坐标 = [604,133]// 正方9:16
// 取色点坐标 = [822,516]// 正方9:16 中心白色
// 取色点坐标 = [548,173]// 正方3:4
// 取色点坐标 = [500,220]// 正方4:3
iRet = Dialog.MsgBox("","Laiye Automation",0,1,0)
For i = 0 To 张 step 1
If i=0
Rem 打开图片
Keyboard.Press("O", "press", ["Ctrl"],{"iDelayAfter": 300, "iDelayBefore": 3000, "sSimulate": "simulate"})
Keyboard.InputText(@ui"窗口1",地址,true,20,10000,{"bContinueOnError": false, "iDelayAfter": 500, "iDelayBefore": 2000, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})
Mouse.Action(@ui"窗口_打开(O)","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})
图片名=Right(文件名[i],8)
Keyboard.InputText(@ui"窗口",图片名,true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})
Mouse.Action(@ui"窗口_打开(O)","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})
Rem 魔棒
Mouse.Move(15, 182, false,{"iDelayAfter": 300, "iDelayBefore": 200})
Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
Rem 图像
Mouse.Move(500, 220, false,{"iDelayAfter": 300, "iDelayBefore": 200})
Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
// Rem 新建图层
// Mouse.Move(1855, 1037, false,{"iDelayAfter": 300, "iDelayBefore": 200})
// Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
Rem 填充
Mouse.Move(21, 394, false,{"iDelayAfter": 300, "iDelayBefore": 200})
Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
Rem 图像
Mouse.Move(500, 220, false,{"iDelayAfter": 300, "iDelayBefore": 200})
Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
// Rem 合并
// Keyboard.Press("E", "press", ["Ctrl"],{"iDelayAfter": 300, "iDelayBefore": 200, "sSimulate": "simulate"})
Rem 取消框线保存
Keyboard.Press("D", "press", ["Ctrl"],{"iDelayAfter": 300, "iDelayBefore": 200, "sSimulate": "simulate"})
Keyboard.Press("S", "press", ["Ctrl"],{"iDelayAfter": 300, "iDelayBefore": 200, "sSimulate": "simulate"})
Rem 关闭
Mouse.Move(212, 72, false,{"iDelayAfter": 1000, "iDelayBefore": 200})
Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
End If
If i>0
Rem 打开图片
Keyboard.Press("O", "press", ["Ctrl"],{"iDelayAfter": 300, "iDelayBefore": 3000, "sSimulate": "simulate"})
图片名=Right(文件名[i],8)
Keyboard.InputText(@ui"窗口",图片名,true,20,10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 500, "bSetForeground": true, "sSimulate": "message", "bValidate": false, "bClickBeforeInput": false})
Mouse.Action(@ui"窗口_打开(O)","left","click",10000,{"bContinueOnError": false, "iDelayAfter": 300, "iDelayBefore": 200, "bSetForeground": true, "sCursorPosition": "Center", "iCursorOffsetX": 0, "iCursorOffsetY": 0, "sKeyModifiers": [],"sSimulate": "simulate", "bMoveSmoothly": false})
Rem 魔棒
Mouse.Move(15, 182, false,{"iDelayAfter": 300, "iDelayBefore": 200})
Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
Rem 图像
Mouse.Move(500, 220, false,{"iDelayAfter": 300, "iDelayBefore": 200})
Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
// Rem 新建图层
// Mouse.Move(1855, 1037, false,{"iDelayAfter": 300, "iDelayBefore": 200})
// Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
Rem 填充
Mouse.Move(21, 394, false,{"iDelayAfter": 300, "iDelayBefore": 200})
Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
Rem 图像
Mouse.Move(500, 220, false,{"iDelayAfter": 300, "iDelayBefore": 200})
Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
// Rem 合并
// Keyboard.Press("E", "press", ["Ctrl"],{"iDelayAfter": 300, "iDelayBefore": 200, "sSimulate": "simulate"})
Rem 取消框线保存
Keyboard.Press("D", "press", ["Ctrl"],{"iDelayAfter": 300, "iDelayBefore": 200, "sSimulate": "simulate"})
Keyboard.Press("S", "press", ["Ctrl"],{"iDelayAfter": 300, "iDelayBefore": 200, "sSimulate": "simulate"})
Rem 关闭
Mouse.Move(212, 72, false,{"iDelayAfter": 1000, "iDelayBefore": 200})
Mouse.Click("left", "click", [],{"iDelayAfter": 300, "iDelayBefore": 300})
End If
Next
App.Kill(iPID)
Dim sRet
Dim sName
代码正式开始
红色背景、切边图、透明图
'''
去边后白色地方变成透明色
星火讯飞、阿夏
20240817
'''
print('----1、切掉上下左右的白色图层------')
import os
from PIL import Image
import os,time
import shutil
from docx import Document
from docx.shared import Cm
from PIL import Image
from PyPDF2 import PdfFileMerger, PdfFileReader
from PIL import Image, ImageDraw, ImageFont
import os,random
path=r'D:\20241122青蛙小鸡\02青蛙'
folder_path = path+r'\01修图红色'
# 留一点白边
white_edge=0
# C:\Users\jg2yXRZ\OneDrive\图片\20240817饮料甜甜圈\甜甜圈白色
import os
from PIL import Image
def find_non_white_pixel(image):
width, height = image.size
left, right, top, bottom = width, 0, height, 0
for y in range(height):
for x in range(width):
r, g, b = image.getpixel((x, y))
if r != 255 or g != 0 or b != 0:
# 红色切边
if x < left:
left = x
if x > right:
right = x
if y < top:
top = y
if y > bottom:
bottom = y
return left, right, top, bottom
def 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 = 0
# max_height = 0
# for 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.size
# if width > max_width:
# max_width = width
# max_height = height
# return max_width, max_height
# fold_path = output_folder
# max_width, max_height = get_max_width_and_height(fold_path)
# print("最大宽度:", max_width)
# print("最大高度:", max_height)
# 最大宽度: 724
# 最大高度: 869
# # 自定义长宽
# max_width=622
# max_height=877
# # 统一所有图片大小
# def resize_image(image_path, output_folder, new_image_name):
# img = Image.open(image_path)
# new_img = img.resize((max_width,max_height))
# new_img.save(os.path.join(output_folder, new_image_name))
# for file in os.listdir(output_folder):
# if file.endswith('.png'):
# input_image_path = os.path.join(output_folder, file)
# new_image_name = f"{file[:-4]}.png"
# resize_image(input_image_path, newput_folder, new_image_name)
'''
图片透明
'''
from PIL import Image
import os
def process_image(file_path):
img = Image.open(file_path)
img = img.convert("RGBA")
datas = img.getdata()
new_data = []
for item in datas:
if item[0] == 255 and item[1] == 0 and item[2] == 0:
# 红色
new_data.append((255, 0, 0, 0))
else:
new_data.append(item)
img.putdata(new_data)
return img
input_folder = path+r'\02切边图'
output_folder = path+r'\03透明图'
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for file_name in os.listdir(input_folder):
if file_name.endswith(".png") or file_name.endswith(".jpg") or file_name.endswith(".jpeg"):
input_file_path = os.path.join(input_folder, file_name)
output_file_path = os.path.join(output_folder, file_name)
processed_image = process_image(input_file_path)
processed_image.save(output_file_path)
用代码去掉多余的红色边,(切边图)把青蛙最大化+红色部分变成透明色
红色背景(255,0,0)动物最大化(每张尺寸都不同)
浅蓝色背景,说明是透明的
3、左边图案翻转到右侧,右侧图片翻转到左侧
对透明图进行剪切(颜色改成255,0,0,RGBA透明)
'''
三角嘴立体书第2步-制作拼合动物
星火讯飞:阿夏
20241215
'''
import os
import time
from PIL import Image
path = r'D:\20241122青蛙小鸡\02青蛙'
# 定义源文件夹和目标文件夹
source_folder = path + r'\03透明图'
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('RGBA', (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()
# 遍历源文件夹中的所有文件 右一半复制
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('RGBA', (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("所有图片已处理完毕!")
两组图案差异不大,所以本次我就用了左图进行随机三角嘴制作。
4、制作大量随机生成的嘴巴虚线图
几个参数修改
cd=嘴缝的水平线(左右)长度、
gd=三角嘴中心点的Y坐标(距离顶部的距离)
xgd=嘴上下顶点的距离(小于cd*2)
确保青蛙嘴是扁平的
代码展示
'''
三角嘴立体书第3步-添加三角锥,批量生成大量,人工挑选
星火讯飞:阿夏
20241215
'''
import glob,os
t=['左','右']
d1=2
d2=d1*5
from PIL import Image, ImageDraw
path=r'D:\20241122青蛙小鸡\02青蛙'
p=path+fr'\04拼合图{t[0]}'
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): # 青蛙嘴横线(剪开线)的左右长度 50*2
for xgd in range(30,200,10): # 扁嘴的上下高度
for gd in range(50,200,20): # Y的位置
fin=path+fr'\05随机\004拼合图{t[0]}嘴_长{cd}高{gd}小高{xgd}'
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 // 2
print(center_x)
# 设置水平线的起点和终点
start_x = center_x - cd # 向左100像素
end_x = center_x + cd # 向右100像素
y_position = gd # y坐标为100
print(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坐标为0
start_y = gd # 起点y坐标为图片高度(底部)
end_x = center_x # 终点x坐标为图片宽度
end_y = gd- xgd # 终点y坐标为0(顶部)
print(start_x,start_y,end_x,end_y )
dx = end_x - start_x
dy = end_y - start_y
steps = max(abs(dx), abs(dy)) // d2 # 每20像素画一个实线段
# 绘制虚线
for i in range(steps):
x = start_x + i * dx / steps
y = start_y + i * dy / steps
draw.line((x, y, x+d1, y-d1), fill='black', width=3)
# 第3-2:画折叠虚线 (左下)
# 设置虚线的起点和终点
start_x = center_x-cd # 起点x坐标为0
start_y = gd # 起点y坐标为图片高度(底部)
end_x = center_x # 终点x坐标为图片宽度
end_y = gd+ xgd # 终点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_x
dy = end_y - start_y
steps = max(abs(dx), abs(dy)) // d2 # 每20像素画一个实线段
# 绘制虚线
for i in range(steps ):
x = start_x + i * dx / steps
y = start_y + i * dy / steps
draw.line((x, y, x+d1, y+d1), fill='black', width=3)
# 第3-3:画折叠虚线 (右上)
# 设置虚线的起点和终点
start_x = center_x # 起点x坐标为0
start_y = gd- xgd # 起点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_x
dy = end_y - start_y
steps = max(abs(dx), abs(dy)) // d2 # 每20像素画一个实线段
# 绘制虚线
for i in range(steps ):
x = start_x + i * dx / steps
y = start_y + i * dy / steps
draw.line((x, y, x+d1, y+d1), fill='black', width=3)
# 第3-4:画折叠虚线 (右下)
# 终点y坐标为0(顶部)
start_x = center_x # 起点x坐标为0
start_y =gd+ xgd # 起点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_x
dy = end_y - start_y
steps =max(abs(dx), abs(dy)) // d2 # 每20像素画一个实线段
# 绘制虚线
for i in range(steps):
x = start_x + i * dx / steps
y = start_y + i * dy / steps
draw.line((x, y, x+d1, y-d1), fill='black', width=3)
# 显示修改后的图片
image.save(fin+fr'\{g:05}.png')
经过1个小时,获取544个文件,共28288图
因为我的电脑满了,所以我用转移的方式,合并后有28288个
'''
三角嘴立体书第4步-合并所有随机生成的的图片,人工挑选 青蛙
星火讯飞:阿夏
20241215
'''
# Python,读取123文件下所有子文件夹里面的图片,合并在234文件内,如果有重名的,在文件名后面添加数字(递增)
import os
import shutil
path=r'D:\20241122青蛙小鸡\02青蛙'
# 源目录和目标目录
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 = 1
while os.path.exists(dest_file_path):
name, ext = os.path.splitext(file)
new_file_name = f"{name}_{counter:03}{ext}"
dest_file_path = os.path.join(dest_directory, new_file_name)
counter += 1
# 复制文件到目标目录
# shutil.copy2(src_file_path, dest_file_path)
# 剪切移动文件到目标目录
shutil.move(src_file_path, dest_file_path)
print(f"Copied {src_file_path} to {dest_file_path}")
“随机”文件的图片都移走了
2万张图片进入“06青蛙整理”文件夹
整理筛选图片,同一个青蛙有554张,所以单独拷贝出来,筛选
嘴缝太长,不要
嘴缝太细,不要
嘴缝太高,不要
嘴缝移到身体上,不要
三角超过头部位置,不要
同样方法筛选其他的(确保嘴巴贴脸颊,三角嘴最大,但是不是正菱形)
花了五个小时,终于筛选出所有的图片 共52种动物, 电脑都要崩盘了,不得不反复清空回收站。不想再做“右图”的筛选了
删除几张青蛙特征不明显的图片
保留了40张
6、制作PDF(只有青蛙,无背景图)
# '''
# 目的: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 Image
print('----------第1步:提取所有的幼儿照片的路径------------')
# 读取123文件夹下的所有图片
path = r'D:\20241122青蛙小鸡'
path1=path+r'\02青蛙'
folder= os.path.join(path1, '06青蛙整理') # 100
folder_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 PdfFileMerger
pdf_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)
效果展示
PS:因为“小鸡-农场”“青蛙-池塘”的AI背景图还没有下载好,所以这里先用PPT做一下效果预览
我希望背景图也是简笔画线描形式,但是用一样的关键词,通义万相2.0改版后做不出这个效果(小草都是带灰色,但我希望纯黑白线条,便于涂色),而通义万相1.0总是爆满不能生成。所以还要等待。
总之把主体动物图片的背景色变成透明色,可以拼接背景图案,进一步丰富立体贺卡的画面效果。
--------------------2024年12月17日-----------------
还是用1.0才能出现我想要的简笔画效果
花园草地,涂色书,涂色书、涂色书,简单笔画,卡通,黑白轮廓线,黑白轮廓线、黑白轮廓线、未着色,幼儿插图,线条画,没有背景,没有颜色,黑白漫画线条艺术:,线描,空背景,粗轮廓,清晰的线条,矢量线。简单,大,
荷塘,涂色书,涂色书、涂色书,简单笔画,卡通,黑白轮廓线,黑白轮廓线、黑白轮廓线、未着色,幼儿插图,线条画,没有背景,没有颜色,黑白漫画线条艺术:,线描,空背景,粗轮廓,清晰的线条,矢量线。简单,大,
UIBOT下载
挑选删除不要的,留下48张
青蛙也配48个
封面图(拼图图左)也只有保留48个
开始把青蛙和荷塘背景组合
'''
# 目的:青蛙图片与池塘图片中心点拼合,根据池塘图片高度调证青蛙大小
# 作者:阿夏
# 时间:2024年12月17日17:27
提问:
1、python 读取123文件夹下的每一张图片,获取长宽,再读取234文件夹的每一张图片,获取长宽,把234下的第一张图片贴入123下第一张图片的中心位置(两份图片的中心点是一样的。)然后是第2张图片也是这样操作。图片另存在345文件夹下。不要def
2、在以上代码的基础上,继续修改,根据123文件夹下的图片的高度,来自动调整234文件夹下的图片的高度小于前者的高度(同时等比例调整宽度)
'''
import os
from PIL import Image
path=r'D:\20241122青蛙小鸡\02青蛙'
# 定义文件夹路径
folder1 =path+r'\07荷塘'
folder2 =path+r'\06青蛙整理'
folder3 = path+r'\08青蛙合并图'
# 是否希望青蛙撑满高度,不要顶格,就上下留空
k=100
# 确保输出文件夹存在
if not os.path.exists(folder3):
os.makedirs(folder3)
# 获取文件夹中的图片文件列表
images1 = [f for f in os.listdir(folder1) if f.endswith(('png', 'jpg', 'jpeg'))]
images2 = [f for f in os.listdir(folder2) if f.endswith(('png', 'jpg', 'jpeg'))]
# 遍历每对图片
for i, (img1_name, img2_name) in enumerate(zip(images1, images2)):
# 打开图片
img1_path = os.path.join(folder1, img1_name)
img2_path = os.path.join(folder2, img2_name)
img1 = Image.open(img1_path)
img2 = Image.open(img2_path)
# 获取图片尺寸
width1, height1 = img1.size
width2, height2 = img2.size
# 计算缩放比例
scale_ratio = height1 / height2
# 调整第二张图片的大小(等比例缩放)
new_width2 = int(width2 * scale_ratio)-k
new_height2 = int(height2 * scale_ratio)-k
img2 = img2.resize((new_width2, new_height2), Image.ANTIALIAS)
# 重新获取调整后的图片尺寸
width2, height2 = img2.size
# 计算中心点坐标
center_x1, center_y1 = width1 // 2, height1 // 2
center_x2, center_y2 = width2 // 2, height2 // 2
# 计算粘贴位置
paste_x = center_x1 - center_x2
paste_y = center_y1 - center_y2
# 创建一个新的图像,大小与第一个图像相同
result_img = img1.copy()
# 将第二个图像粘贴到第一个图像的中心位置
result_img.paste(img2, (paste_x, paste_y), img2)
# 保存结果图像到目标文件夹
result_img_path = os.path.join(folder3, f'{i:02}.png')
result_img.save(result_img_path)
星火讯飞的代码是等比例调整,把青蛙的高度与背景图的宽度调的一样(顶天立地)
我不希望顶格,就在等比例后再减去写空边
由此,可以做50-200的遍历,把所有大小的青蛙都做一套,然后移动合并在一起,根据背景筛选最适合的图片
此时我发现池塘图片是16:9,因为1.0版本只有1:1、16:9、9:16三种
所以16:9的图片要裁剪边缘,通过计算WORD单元格高度(19.45*14.1), 裁剪第一张图像的高720和宽1008部分,1280*720.高不变,19.75*720/14.1=1008.51
代码展示
'''
# 目的:青蛙图片与池塘图片中心点拼合,根据池塘图片高度调证青蛙大小(上下空位置的遍历)
# 作者:阿夏
# 时间:2024年12月17日17:27
提问:
1、python 读取123文件夹下的每一张图片,获取长宽,再读取234文件夹的每一张图片,获取长宽,把234下的第一张图片贴入123下第一张图片的中心位置(两份图片的中心点是一样的。)然后是第2张图片也是这样操作。图片另存在345文件夹下。不要def
2、在以上代码的基础上,继续修改,根据123文件夹下的图片的高度,来自动调整234文件夹下的图片的高度小于前者的高度(同时等比例调整宽度)
3、第一张图像的长宽,只需要其中高720和宽1008的部分图案
'''
import os
from PIL import Image
path=r'D:\20241122青蛙小鸡\02青蛙'
# 定义文件夹路径
folder1 =path+r'\07荷塘'
folder2 =path+r'\06青蛙整理'
folder3 = path+r'\08青蛙合并图'
# 是否希望青蛙撑满高度,不要顶格,就上下留空
k=200
for k in range(50,360,50):
folder4 = folder3 +fr'\01分类\{k}'
# folder4 = folder3 + fr'\01分类\{k}'
# 确保输出文件夹存在
if not os.path.exists(folder4):
os.makedirs(folder4)
# 获取文件夹中的图片文件列表
images1 = [f for f in os.listdir(folder1) if f.endswith(('png', 'jpg', 'jpeg'))]
images2 = [f for f in os.listdir(folder2) if f.endswith(('png', 'jpg', 'jpeg'))]
# 遍历每对图片
for i, (img1_name, img2_name) in enumerate(zip(images1, images2)):
# 打开图片
img1_path = os.path.join(folder1, img1_name)
img2_path = os.path.join(folder2, img2_name)
img1 = Image.open(img1_path)
img2 = Image.open(img2_path)
# 裁剪第一张图像的高720和宽1008部分,1280*720.高不变,19.75*720/14.1=1008.51
# cropped_img1 = img1.crop((0, 0, 1008, 720))
# 如果需要居中切割
cropped_img1 = img1.crop((136, 0, 1008+136, 720))
# 获取图片尺寸
width1, height1 = cropped_img1.size
width2, height2 = img2.size
# 计算缩放比例
scale_ratio = height1 / height2
# 调整第二张图片的大小(等比例缩放)
new_width2 = int(width2 * scale_ratio) - k
new_height2 = int(height2 * scale_ratio) - k
img2 = img2.resize((new_width2, new_height2), Image.ANTIALIAS)
# 重新获取调整后的图片尺寸
width2, height2 = img2.size
# 计算中心点坐标
center_x1, center_y1 = width1 // 2, height1 // 2
center_x2, center_y2 = width2 // 2, height2 // 2
# 计算粘贴位置
paste_x = center_x1 - center_x2
paste_y = center_y1 - center_y2
# 创建一个新的图像,大小与第一个图像相同
result_img = cropped_img1.copy()
# 将第二个图像粘贴到第一个图像的中心位置
result_img.paste(img2, (paste_x, paste_y), img2)
# 保存结果图像到目标文件夹
result_img_path = os.path.join(folder4, f'{i:02}.png')
result_img.save(result_img_path)
# 移动到一起
# Python,读取123文件下所有子文件夹里面的图片,合并在234文件内,如果有重名的,在文件名后面添加数字(递增)
import os
import shutil
# 源目录和目标目录
folder5 = folder3+fr'\02合并'
# 确保目标目录存在
if not os.path.exists(folder5):
os.makedirs(folder5)
# 遍历源目录下的所有子目录和文件
for root, dirs, files in os.walk(folder3):
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(folder5, file)
# 如果目标文件已存在,添加数字后缀
counter = 1
while os.path.exists(dest_file_path):
name, ext = os.path.splitext(file)
new_file_name = f"{name}_{counter:03}{ext}"
dest_file_path = os.path.join(folder5, new_file_name)
counter += 1
# 复制文件到目标目录
# shutil.copy2(src_file_path, dest_file_path)
# 剪切移动文件到目标目录
shutil.move(src_file_path, dest_file_path)
print(f"Copied {src_file_path} to {dest_file_path}")
shutil.rmtree(folder3 +fr'\01分类')
最后只留下合并
合并里面有336张图片
七选一
大部分都选最后一张100像素
特殊青蛙图案,选不遮挡背景图的一张
左右也留点空
最后挑选出来的68图放到“青蛙合并图下”
发现问题:
红色244,0,0抠不干净,下次用不同的白色(255,255,253),这样就不明显
第8步:最后制作PDF
# '''
# 目的:青蛙,池塘、封面青蛙打包PDF
# 作者:阿夏
# 时间:2024年12月17日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 Image
print('----------第1步:提取所有的幼儿照片的路径------------')
# 读取123文件夹下的所有图片
path = r'D:\20241122青蛙小鸡'
path1=path+r'\02青蛙'
folder1= os.path.join(path1, '04拼合图左') # 封面
folder2= os.path.join(path1, '08青蛙合并图') # 青蛙与池塘合并图
folder_files1 = [os.path.join(folder1, f) for f in os.listdir(folder1) if f.endswith('.jpg') or f.endswith('.png')]
folder_files2 = [os.path.join(folder2, f) for f in os.listdir(folder2) 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_files1))): # 读取图片的全路径 的数量 31张
doc = Document(path+r'\立体书三角嘴.docx')
table = doc.tables[0] # 4567(8)行
face=folder_files1[nn] # 封面的图片
# 读取图片并垂直翻转
image = Image.open(face)
flipped_image = image.transpose(Image.FLIP_TOP_BOTTOM) # 垂直翻转
# 保存翻转后的图片到临时文件
temp_image_path = path + r'\temp_image.png'
flipped_image.save(temp_image_path)
# 写入1张小图封面
run = doc.tables[0].cell(0, 0).paragraphs[0].add_run() # 图片位置 第一个表格的0 3 插入照片
# run.add_picture(r'{}'.format(temp_image_path), width=Cm(9.88))# 以宽度为标准,确定高度,图片宽度(单元格宽度)
run.add_picture(r'{}'.format(temp_image_path), width=Cm(4.5))# 以宽度为标准,确定高度,图片宽度(人工宽度,图案小一点,可以写文字)
table.cell(0, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 居中
flog=folder_files2[nn] # 青蛙的图片
# 写入1张大图-青蛙
run = doc.tables[0].cell(1, 0).paragraphs[0].add_run() # 图片位置 第一个表格的0 3 插入照片
run.add_picture(r'{}'.format(flog), height=Cm(14.1)) # 图片高度(单元格高度)因为青蛙与背景合并成最大了,就用最高尺寸
# run.add_picture(r'{}'.format(flog), height=Cm(12))
# 以高度为标准,确定宽度
table.cell(1, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 居中
doc.save(new_folder+fr'\{nn:03d}.docx')
time.sleep(3)
print('----------第4步:把都有PDF合并为一个打印用PDF------------')
# 将10个docx转为PDF
import os
from docx2pdf import convert
from PyPDF2 import PdfFileMerger
pdf_output_path = path+fr"\青蛙立体书三角嘴封面顺序({len(folder_files1)}人共{len(folder_files1)}份).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)
time.sleep(10)