首页 > 其他分享 >【教学类-83-02】20241214立体书三角嘴2.0——青蛙(扁菱形嘴)

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

时间:2024-12-17 22:56:17浏览次数:6  
标签:02 20241214 import new file path 83 folder os

背景需求:

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

【教学类-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自动填充背景红色的录像

<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)

    

 

最后效果:

小青蛙方面:提示这是贺卡的第一面

大青蛙+池塘:此页制作立体贺卡三角嘴

完成了,用160G白卡纸打印试试

标签:02,20241214,import,new,file,path,83,folder,os
From: https://blog.csdn.net/reasonsummer/article/details/144510078

相关文章

  • CSP-S 2021 游记
    2021.10.22来到杭州,然后打印乱七八糟的东西,吃了兰州拉面???晚上睡不着。2021.10.23早上\(5:00\)就起来划水,上午普及组打铁。\(2h\)打完四道暴力,然后开始扫雷(。预估得分:\(355\);中午吃完饭就快一点半了,很困。下午更困了屮。\(14:00\)进场,趴着睡了\(20min\)。\(1......
  • NOIP2023 游记
    写在前面意料之外的结局。已经过了一个多月了啊,本来没想写的,但不写又好像少了点什么,权当记录一下三年的OI生活吧。开始回忆。Day-?高三有推荐名额!赶紧去拉人。CCF说没交480的都不能去,寄。Day0没什么特别的,中午大巴去杭师大仓前,三年NOIP都在这里考。到的时候已......
  • [蓝桥杯 2021 省 AB2] 国际象棋
    题目Description众所周知,“八皇后”问题是求解在国际象棋棋盘上摆放 8 个皇后,使得两两之间互不攻击的方案数。已经学习了很多算法的小蓝觉得“八皇后”问题太简单了,意犹末尽。作为一个国际象棋迷,他想研究在 N×M 的棋盘上,摆放 K 个马,使得两两之间互不攻击有多少种摆......
  • Ilya在NeurIPS 2024最新演讲:Summary、演讲稿、Slides和QA
    IlyaSutskever:“Sequencetosequencelearningwithneuralnetworks:whatadecade”Link:https://www.youtube.com/watch?v=1yvBqasHLZsIlyaSutskeverfulltalk“Sequencetosequencelearningwithneuralnetworks:whatadecade”atNeurIPS2024inVa......
  • 2024告别培训班 数通、安全、云计算、云服务、存储、软考等1000G资源分享
    大类有:软考初级软考中级软考高级华为认证华三认证:软考初级:信息处理技术员 程序员网络管理员软考中级:信息安全工程师 信息系统监理师信息系统管理工程师嵌入式系统设计时数据库系统工程师电子商务设计师系统集成项目管理工程师网络工程师软件设计师软件测......
  • Java 面试常见问题总结(2025 最新版)
    分析了几百份大中小厂的面经,整理了Java面试中最最最常问的一些问题!目前已经是2025年最新版,针对今年的面试情况又做了完善和补充。涵盖了Java基础、集合框架、并发编程、JVM、操作系统、MySQL、Redis、ES、系统设计、分布式、高并发等知识点的面试题,全部都是面试常问的......
  • 2024 Webstorm安装使用教程(附激活,以及常见问题处理)
    第一步:下载Webstorm安装包访问Webstorm官网,下载Webstorm第二步:安装Webstorm下载完成后,进行安装,next,安装完成点击xx关掉程序!第三步:下载补丁Webstorm补丁文件点击获取补丁下载成功后,打开标注的文件文件夹,进入到文件夹/jetbra注意:这个文件夹单独copy一份......
  • 20241217每日一题洛谷P1803
    普及-每日一题洛谷P1683题目描述现在各大oj上有\(n\)个比赛,每个比赛的开始、结束的时间点是知道的。yyy认为,参加越多的比赛,noip就能考的越好(假的)。所以,他想知道他最多能参加几个比赛。由于yyy是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加\(2\)个及以上的......
  • 2024/12/27 总结
    2024/12/27总结模拟赛T1取石子游戏A和B两人玩取石子游戏。一共有n堆石子,第堆有α个石子。A和B轮流取石子,A先取,每次选择一堆然后取任意数量的石子(不能不取)。但是B必须取两次,即取石子的顺序是,ABBABB...。当一方无法取石子,则输掉游戏。假设A和B均绝顶聪明,请判断A是否可以获,胜......
  • Crashlytics:Crashlytics自动化测试集成_2024-07-23_15-36-45.Tex
    Crashlytics:Crashlytics自动化测试集成Crashlytics自动化测试集成Crashlytics概述Crashlytics是Firebase提供的一款强大的错误报告工具,它能够帮助开发者监控和分析应用的崩溃情况,提供详细的崩溃报告,包括崩溃发生的时间、地点、设备信息、操作系统版本等,从而帮助开发者快......