当前位置: 首页 > news >正文

【教学类-83-02】20241214立体书三角嘴2.0——青蛙(扁菱形嘴)

背景需求:

制作小鸡立体贺卡三角嘴,它的嘴是正菱形(四条边长度相等,类似正方形)

【教学类-83-01】20241215立体书三角嘴1.0——小鸡(正菱形嘴)-CSDN博客文章浏览阅读744次,点赞22次,收藏11次。【教学类-83-01】20241215立体书三角嘴1.0——小鸡(正菱形嘴)https://blog.csdn.net/reasonsummer/article/details/143987230

第二种是青蛙,嘴巴要更狭长一些(角度不是45度)

用以上的数值测试后,发现虚线存在问题。

通过反复测试,终于找到成因

1、再做垂线高度的设置(变化的,30磅到120磅之间的移动)

2、修改Y轴坐标数,同时把尺的比例从1:2,变成1:5

效果:

 我想用AI绘画和Python做出立体书三角嘴(青蛙)的图纸

1、通义万相下载青蛙正脸图片

卡通简笔画,白色背景,青蛙,全身像,正面对称造型,正面对称造型,正面对称造型黑白轮廓线,无着色,简单,可爱,矢量图,大。尖尖嘴,没有颜色

下载后挑选青蛙正脸图片

 PS,人工把青蛙嘴巴擦掉,去掉颜色(变成黑白)

动物的嘴巴去掉了。

2、修图,把白色背景变成红色

我想把青蛙图片背景变成用PS批量填充为红色,然后切掉红色空边(图片变小),红色再转成透明,便于最后把青蛙与池塘背景图重叠。

以下是UIBOT+PS自动填充背景红色的录像

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:3iRet = Dialog.MsgBox("","Laiye Automation",0,1,0)
For i = 0 To 张 step 1If 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 IfIf 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
NextApp.Kill(iPID)
Dim sRet
Dim sName

代码正式开始

红色背景、切边图、透明图

'''
去边后白色地方变成透明色
星火讯飞、阿夏
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 != 0 or b != 0:# 红色切边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 = 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 osdef 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 imginput_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 Imagepath = 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*2for 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 // 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- xgd         # 终点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)) // d2  # 每20像素画一个实线段# 绘制虚线for i in range(steps):x = start_x + i * dx / stepsy = start_y + i * dy / stepsdraw.line((x, y, x+d1, y-d1), fill='black', width=3)# 第3-2:画折叠虚线 (左下)    # 设置虚线的起点和终点start_x =  center_x-cd        # 起点x坐标为0start_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_xdy = end_y - start_ysteps = max(abs(dx), abs(dy)) // d2  # 每20像素画一个实线段# 绘制虚线for i in range(steps ):x = start_x + i * dx / stepsy = start_y + i * dy / stepsdraw.line((x, y, x+d1, y+d1), fill='black', width=3)# 第3-3:画折叠虚线 (右上)    # 设置虚线的起点和终点start_x =  center_x        # 起点x坐标为0start_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_xdy = end_y - start_ysteps = max(abs(dx), abs(dy)) // d2  # 每20像素画一个实线段# 绘制虚线for i in range(steps ):x = start_x + i * dx / stepsy = start_y + i * dy / stepsdraw.line((x, y, x+d1, y+d1), fill='black', width=3)# 第3-4:画折叠虚线 (右下)# 终点y坐标为0(顶部)start_x =   center_x       # 起点x坐标为0start_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_xdy = end_y - start_ysteps =max(abs(dx), abs(dy)) // d2  # 每20像素画一个实线段# 绘制虚线for i in range(steps):x = start_x + i * dx / stepsy = start_y + i * dy / stepsdraw.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 = 1while 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 Imageprint('----------第1步:提取所有的幼儿照片的路径------------')# 读取123文件夹下的所有图片
path = r'D:\20241122青蛙小鸡'
path1=path+r'\02青蛙'
folder= os.path.join(path1, '06青蛙整理')  # 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)

效果展示

PS:因为“小鸡-农场”“青蛙-池塘”的AI背景图还没有下载好,所以这里先用PPT做一下效果预览

我希望背景图也是简笔画线描形式,但是用一样的关键词,通义万相2.0改版后做不出这个效果(小草都是带灰色,但我希望纯黑白线条,便于涂色),而通义万相1.0总是爆满不能生成。所以还要等待。

总之把主体动物图片的背景色变成透明色,可以拼接背景图案,进一步丰富立体贺卡的画面效果。

相关文章:

【教学类-83-02】20241214立体书三角嘴2.0——青蛙(扁菱形嘴)

背景需求&#xff1a; 制作小鸡立体贺卡三角嘴&#xff0c;它的嘴是正菱形&#xff08;四条边长度相等&#xff0c;类似正方形&#xff09; 【教学类-83-01】20241215立体书三角嘴1.0——小鸡&#xff08;正菱形嘴&#xff09;-CSDN博客文章浏览阅读744次&#xff0c;点赞22次…...

vscode设置终端代理

转载请标明出处&#xff1a;小帆的帆的博客 设置终端代理 修改项目的.vscode/settings.json {"terminal.integrated.env.windows": {"http_proxy": "http://127.0.0.1:7890","https_proxy": "http://127.0.0.1:7890"}, }…...

【C++】函数计算题解论

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;思路解析3.1 函数的递归定义3.2 边界条件控制3.3 记忆化搜索 &#x1f4af;C实现代码&#x1f4af;添加解释&#x1f4af;小结 &#x1f4af;前言 在…...

Redis篇-21--运维篇3-集群(分片,水平扩展,高可用,集群配置案例,扩展哨兵案例)

1、概述 Redis集群&#xff08;Cluster&#xff09;通过分片&#xff08;sharding&#xff09;实现了水平扩展&#xff0c;允许数据分布在多个节点上&#xff0c;从而提升性能和存储容量。 在Redis集群中&#xff0c;数据被分割成16384个哈希槽&#xff08;hash slots&#x…...

Unity3d场景童话梦幻卡通Q版城镇建筑植物山石3D模型游戏美术素材

注明&#xff1a;网络素材&#xff0c;仅供学习使用&#xff01; https://download.csdn.net/download/elineSea/90017291...

深入理解addEventListener中的第二个参数:listener

起因 首先&#xff0c;之前留给我们的一点东西&#xff0c;js的深入内容关键在addEventListener&#xff0c;这个函数中的参数&#xff0c;它们三个参数&#xff0c;分别为type、listener、options&#xff0c;当然在这里还有一些小的问题&#xff0c;比如mdn文档中它介绍到了另…...

数据库镜像(Database Mirroring):高可用性与灾难恢复技术

一、引言 在现代信息系统中&#xff0c;数据的可用性和完整性至关重要&#xff0c;尤其是对金融、电商、医疗等高并发和高可靠性要求的行业。数据库镜像&#xff08;Database Mirroring&#xff09; 作为一种高可用性与灾难恢复技术&#xff0c;通过将主数据库的数据实时复制到…...

【Qt】按钮类控件:QPushButton、QRadioButton、QCheckBox、ToolButton

目录 QPushButton 例子&#xff1a; QRadioButton 例子&#xff1a; 按钮的常见信号函数 单选按钮分组 例子&#xff1a; QCheckButton 例子&#xff1a; QToolButton QWidget的常见属性及其功能对于它的派生类控件都是有效的(也就是Qt中的各种控件)&#xff0c;包括…...

day-21 内核链表以及栈

1.昨日作业 1.删除指定节点 找到删除就完事了&#xff0c;双向可以停在删除处。 /***************************** 功能&#xff1a;删除指定结点&#xff08;通过姓名&#xff09;* 参数&#xff1a;phead&#xff1b;oldname; * 返回&#xff1a;成功0&#xff0c;失-1&…...

深度与视差的关系及其转换

深度与视差的关系及其转换 在计算机视觉和立体视觉中&#xff0c;深度和视差是两个重要的概念。理解这两者之间的关系对于实现立体图像处理、三维重建以及深度估计至关重要。在这篇博客中&#xff0c;我们将深入探讨深度和视差的概念&#xff0c;并介绍它们之间的转换关系。 …...

Unity全局光照详解

之前就学过但是太久没用又忘了&#xff0c;因此用最简洁易懂的语言做个记录。 全局光照分为两个系统&#xff0c;分别是实时光照和混合光照。&#xff08;点击window/Rendering/Lighing打开此面板&#xff09; 其中全局光照对于我来说都是新技术了&#xff0c;上一次学…...

外观模式的理解和实践

外观模式&#xff08;Facade Pattern&#xff09;是一种常用的软件设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口。该模式定义了一个高层的接口&#xff0c;使得子系统更容易使用。简单来说&#xff0c;外观模式就是通过引入一个外观角色…...

【前端知识】Javascript进阶-类和继承

文章目录 概述一、类&#xff08;Class&#xff09;二、继承&#xff08;Inheritance&#xff09; 三、继承的实现方式作用一、类和作用二、继承和作用 概述 当然可以&#xff0c;以下是对JavaScript中类和继承的详细介绍&#xff1a; 一、类&#xff08;Class&#xff09; 定…...

Kylin麒麟操作系统 | Nginx服务部署

目录 一、理论储备1. Nginx概述2. Nginx与Apache的区别3. Nginx的服务配置 二、任务实施任务1 Nginx的编译安装1. Server配置2. 客户端测试 任务2 Nginx反向代理1. Server1配置2. Server2配置3. 客户端测试 一、理论储备 1. Nginx概述 Nginx是一个轻量级的web服务器&#xff…...

51单片机--- 串口控制仿真

51单片机--- 串口控制仿真 实验目标:51单片机接收串口数据,根据数据点亮LED。 实验步骤: 在Proteus里画出原理图 在Keil里用C语言编写程序 在Proteus中导入HEX文件,启动仿真 实验协议: 波特率115200 数据位:8位,停止位:1位,校验位:无。 命令格式: 一条命令为…...

<数据集>输电线塔杂物识别数据集<目标检测>

数据集下载链接 &#xff1c;数据集&#xff1e;输电线塔杂物识别数据集&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90141102数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1099张 标注数量(xml文件个数)&#xff1a;1099 …...

HarmonyOS学习 --- Mac电脑获取手机UDID

一&#xff0c;手机打开开发者选项 1&#xff0c;打开“设置 > 关于本机”&#xff0c;连续点击7次版本号&#xff0c;打开开发者选项。 2&#xff0c;打开“USB调试”。 二&#xff0c;配置环境变量 获取OpenHarmony SDK 安装路径 /Users/admin/Library/OpenHarmony/Sdk/10…...

OpenIPC开源FPV之Adaptive-Link地面站代码解析

OpenIPC开源FPV之Adaptive-Link地面站代码解析 1. 源由2. 框架代码3. 软件配置3.1 默认配置3.2 加载配置3.3 更新配置 4. 通信例程4.1 TCP报文解析4.2 UDP报文发送 5. 特殊指令5.1 request_keyframe5.2 drop_gop5.3 resume_adaptive5.4 pause_adaptive 6. 总结7. 参考资料 1. 源…...

Linux Docker环境中解决中文字体乱码问题完整指南

问题背景 在Linux Docker环境中运行涉及中文显示的应用时&#xff08;如Selenium网页截图、PDF生成等&#xff09;&#xff0c;经常会遇到中文显示为方块或乱码的问题。这是因为Linux系统默认没有安装中文字体所导致的。 解决方案 我们可以从Windows系统复制常用中文字体到D…...

[数据结构#1] 并查集 | FindRoot | Union | 优化 | 应用

目录 1. 并查集原理 问题背景 名称与编号映射 数据结构设计 2. 并查集基本操作 (1) 初始化 (2) 查询根节点 (FindRoot) (3) 合并集合 (Union) (4) 集合操作总结 并查集优化 (1) 路径压缩 (2) 按秩合并 3. 并查集的应用 (1) 统计省份数量 (2) 判断等式方程是否成…...

用于卫星影像间接RPC模型精化的通用光束法平差方法

引言 介绍了通用RPC模型的表达式&#xff0c;which has been down to death 描述了RPC模型产生误差的原因——主要与定义传感器方位的姿态角有关。 每个影像都会对应一个三维点云&#xff0c;但是对同一地物拍摄的不同影像对应出来的三维点云是不一样的&#xff0c;所以才需…...

关于Redis主从复制实验操作

需要搭建帮助的可以去taobao搜索Easy Company技术服务&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 需要搭建帮助的可以去taobao搜索Easy Company技术服务&#xff0c;谢谢&#xff01;&#xff01;&#xff01; Redis主从复制需要一主二从&#xff08;共三个Redis…...

【HarmonyOS】鸿蒙获取appIdentifier,Identifier

【HarmonyOS】鸿蒙获取appIdentifier&#xff0c;Identifier 一、前言 三方后台需要填写的所谓appIdentifier&#xff0c;Identifier信息&#xff0c;其实对应鸿蒙应用的appID。 二、解决方案&#xff1a; 注意&#xff0c;模拟器获取data.signatureInfo.appIndentifer为空…...

matplotlib(二)

目录 1、折线图&#xff08;plot&#xff09;与基础绘制图功能 1.1、设置图形风格 2、多坐标系显示图像 3、折线图的应用场景 1、折线图&#xff08;plot&#xff09;与基础绘制图功能 # import matplotlib.pyplot as plt # import random # #1.创建画布 # plt.figure(figs…...

Jenkins容器使用宿主机Docker(五)

DevOps之安装和配置 Jenkins (一) DevOps 之 CI/CD入门操作 (二) Sonar Qube介绍和安装&#xff08;三&#xff09; Harbor镜像仓库介绍&安装 &#xff08;四&#xff09; Jenkins容器使用宿主机Docker&#xff08;五&#xff09; Jenkins流水线初体验&#xff08;六&#…...

基于前后端分离的食堂采购系统源码:从设计到开发的全流程详解

本篇文章&#xff0c;笔者将从系统设计到开发的全过程进行详解&#xff0c;帮助开发者和企业了解如何高效构建一套完善的食堂采购系统。 一、系统需求分析 在开发一套基于前后端分离的食堂采购系统前&#xff0c;必须对业务需求和功能模块进行详细分析&#xff0c;确保系统设…...

git使用教程(超详细)-透彻理解git

一.核心基础 核心概念有六个 首先请把与svn有关的一切概念暂时从你的脑海中移除掉&#xff0c;我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录&#xff0c;你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…...

Bugku---misc---隐写2

题目出处&#xff1a;首页 - Bugku CTF平台 ✨打开发现是一张图片&#xff0c;于是查看属性&#xff0c;放在010查看&#xff0c;这都是基本步骤了&#xff0c;发现里面有一个flag.rar&#xff01;&#xff01;&#xff01;拿binwalk分析也确实存在 ✨于是按照压缩包的起始位置…...

数据仓库工具箱—读书笔记01(数据仓库、商业智能及维度建模初步)

数据仓库、商业智能及维度建模初步 记录一下读《数据仓库工具箱》时的思考&#xff0c;摘录一些书中关于维度建模比较重要的思想与大家分享&#x1f923;&#x1f923;&#x1f923; 博主在这里先把这本书"变薄"~有时间的小伙伴可以亲自再读一读&#xff0c;感受一下…...

将 Ubuntu 22.04 LTS 升级到 24.04 LTS

Ubuntu 24.04 LTS 将支持 Ubuntu 桌面、Ubuntu 服务器和 Ubuntu Core 5 年&#xff0c;直到 2029 年 4 月。 本文将介绍如何将当前 Ubuntu 22.04 系统升级到最新 Ubuntu 24.04 LTS版本。 备份个人数据 以防万一&#xff0c;把系统中的重要数据自己备份一下~ 安装配置SSH访问…...

Springboot3.x配置类(Configuration)和单元测试

配置类在Spring Boot框架中扮演着关键角色&#xff0c;它使开发者能够利用Java代码定义Bean、设定属性及调整其他Spring相关设置&#xff0c;取代了早期版本中依赖的XML配置文件。 集中化管理&#xff1a;借助Configuration注解&#xff0c;Spring Boot让用户能在一个或几个配…...

Python:类方法、实例方法与静态方法深度解析(补)

目录 一.实例变量 二.类变量 三.实例方法 四.类方法 五.静态方法 六.小结 总结 今天看程序时&#xff0c;发现自己好像忘了这三者的区别&#xff0c;所以重新写了一篇深度解析&#xff0c;希望之前看博客没看懂的小伙伴可以通过这个博客分清楚这三个方法。跟的是麦叔的课…...

Certimate:简化 SSL 证书管理的开源工具

引言 SSL(Secure Sockets Layer)证书对于保护网站和用户数据至关重要。然而,管理多个 SSL 证书可能变得繁琐和复杂。为了解决这个问题,Certimate 应运而生。Certimate 是一款开源的 SSL 证书管理工具,旨在简化 SSL 证书的申请、部署和续期流程。它特别适合需要管理多个域…...

rabbitMq举例

新来个技术总监&#xff0c;把 RabbitMQ 讲的那叫一个透彻&#xff0c;佩服&#xff01; 生产者 代码举例 public String sendMsg(final String exchangeName,final String routingKey,final String msg) {} /*** 发送消息* param exchangeName exchangeName* param routin…...

人工智能增强的音频和聊天协作服务

论文标题&#xff1a;AI-enabled Audio and Chat Collaboration Services 中文标题&#xff1a;人工智能增强的音频和聊天协作服务 作者信息&#xff1a; Emil P. Andersen, Norwegian Defence Research Establishment (FFI), Kjeller, NorwayJesper R. Goksr, Sindre E. Ha…...

ctr: content digest XXX not found

1、问题描述 ctr 推送镜像到本地仓库报错 ctr: content digest sha256:b96e30ccb0a1e225493e53d4f81cb2c27183406e5f902ed43c4bf15dc6f21c9c: not found 2、问题原因 本人的平台是M1&#xff0c;正常情况下载镜像会自动按平台寻找版本&#xff0c;但是由于我下载的镜像版本没…...

java内存模型

文章目录 1.java内存模型2.重排序3.内存屏障3.1四类内存屏障指令 4.happens-before4.1 规则5.volatile5.1特性5.2规则5.3 内存语义5.4 内存屏障插入策略 1.java内存模型 java内存模型&#xff08;JMM&#xff09;定义了线程和主内存之间的抽象关系&#xff1a;线程之间的共享变…...

Java Object类与Objects类

1. Object 类 (1) Object类是Java中所有类的祖宗类&#xff0c;因此&#xff0c;Java中所有类的对象都可以直接使用Object类中提供的一些方法(public class Object)。 . (2) Object类常见方法 方法说明public String toString()返回对象的字符串形式public boolean eq…...

【目标检查】YOLO系列之:Triton 推理服务器Ultralytics YOLO11

Triton 推理服务器 1、引言2、Triton服务器2.1 什么是Triton Inference Server2.2 将YOLO11 导出为ONNX 格式2.3 设置Triton 模型库2.3.1 创建目录结构2.3.2 将导出的ONNX 模型移至Triton 资源库 2.4 运行Triton 推断服务器2.4.1 使用 Docker 运行Triton Inference Server2.4.2…...

力扣69. x 的平方根

给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#xff1a;…...

关于目标检测YOLO 各版本区别v1-v11/vX/vR

概述 YOLO&#xff08;You Only Look Once&#xff0c;你只看一次&#xff09;是一系列开创性的实时目标检测模型&#xff0c;它们彻底改变了计算机视觉领域。由Joseph Redmon开发&#xff0c;后续版本由不同研究人员迭代&#xff0c;YOLO模型以其在图像中检测对象的高速度和准…...

求成绩的平均值,统计低于平均分的人数

【问题描述】编写函数double average(double score[ ], int n,int *m)对存放在实型数组中考试成绩进行求平均分和低于平均分的人数&#xff0c;要求在主函数里面进行班级人数和成绩的输入&#xff0c;调用average函数进行计算成绩平均值和低于平均分的人数后&#xff0c;返回主…...

SGD、BGD、MBGD 之间的区别

文章目录 SGD&#xff08;Stochastic Gradient Descent&#xff0c;随机梯度下降&#xff09;BGD&#xff08;Batch Gradient Descent&#xff0c;批量梯度下降&#xff09;MBGD&#xff08;Mini-Batch Gradient Descent&#xff0c;小批量梯度下降&#xff09; 前置&#xff1…...

Android -- WebView之loadData加载html字符串显示网页

目录 前言1. loadUrl 加载网页地址2. loadData 加载Html字符来显示网页3. loadDataWithBaseURL4. 总结 前言 最近在给一个老项目做64位so文件的适配&#xff0c;当应用发布到应用市场上后&#xff0c;用户反馈64位手机上的网页加载不出内容&#xff0c;但32位的手机上是正常…...

单片机:实现数码管00盗99显示(附带源码)

单片机实现数码管00到99显示 在嵌入式开发中&#xff0c;数码管是最常用的显示设备之一&#xff0c;特别适合用于显示数字信息。本项目的目标是利用8051单片机控制数码管实现数字显示&#xff0c;从00到99的循环显示。我们将通过按键或定时器来控制数字的增减&#xff0c;并通…...

大厂面试智力题大全(详细解题思路,持续更新)

目录 八个球有一个比较重,问称几次可以把较重的球拎出来,具体称重的方法是怎样的? 64 匹马 8 个赛道,找出前四名,最少赛多少场(腾讯) 一个城市的加油站数量 5L的水桶和3L的水桶怎么量出4L的水 有一堆粗细不均匀的绳子,燃烧完一个绳子需要2小时,如何用这些绳子凑出…...

使用 acme.sh 签发和自动续期 ssl https 证书

acme.sh 是一个热度非常高的签发和自动续期 https 证书的工具&#xff0c;虽然官网上提供了充分的操作说明&#xff0c;但是不够简洁&#xff0c;本文以在 nginx 中签发和配置http 为例&#xff0c;列出必要的几个简单步骤。 安装 因为网络原因&#xff0c;github 大部分人是…...

YOLOv9改进,YOLOv9引入DLKA-Attention可变形大核注意力,WACV2024,二次创新RepNCSPELAN4结构

摘要 作者引入了一种称为可变形大核注意力 (D-LKA Attention) 的新方法来增强医学图像分割。这种方法使用大型卷积内核有效地捕获体积上下文,避免了过多的计算需求。D-LKA Attention 还受益于可变形卷积,以适应不同的数据模式。 理论介绍 大核卷积(Large Kernel Convolu…...

docker安装mysql8

上一篇提到了docker安装mysql5.7和mysql8有所不同&#xff0c;这一篇说一下mysql8的安装 1、宿主机创建映射目录 mkdir -p /data/mysql8/log mkdir -p /data/mysql8/data mkdir -p /data/mysql8/conf这里我放在了/data/mysql8目录下 2、拉取mysql镜像 docker pull mysql:8.…...

【云原生知识】Kubernets实践-前端服务如何访问后端服务

文章目录 概述步骤1&#xff1a;部署后端服务步骤2&#xff1a;配置Nginx步骤3&#xff1a;创建Nginx服务总结 如何确保 Nginx 能持续访问后端服务&#xff1f;相关文献 概述 假设你正在使用Kubernetes作为容器云平台&#xff0c;以下是如何配置Nginx以及相关服务&#xff0c;…...