首页 > 其他分享 >【教学类-70-02】20240724立体拼图(9方块6图)-N套测试(蝴蝶)

【教学类-70-02】20240724立体拼图(9方块6图)-N套测试(蝴蝶)

时间:2024-07-28 13:55:21浏览次数:19  
标签:02 image grouped 70 print path folder os 20240724

d3869e48c0ff4495a74ed21529c6fb9b.png

 

 

 

背景需求

前期做了一个蝴蝶的六面图

【教学类-70-01】20240724立体拼图(9方块6图)-1套测试(蝴蝶)-CSDN博客文章浏览阅读279次,点赞11次,收藏2次。【教学类-70-01】20240724立体拼图(9方块6图)-1套测试(蝴蝶)https://blog.csdn.net/reasonsummer/article/details/140669551

这次是想测试多张图片制作9个嵌套骰子,实现立体拼图的效果。

333a84a1e0684241b84027f9a1a8bc25.png

通义万相下载的正方形彩色图片(1:1)

300ed337bdb74817a800ce16d836c89b.png

word模版(一个两页)

7e51fff92c354afa98df993db84bdfe1.png

4bedd9e438d14f819e27877b7f04e3ce.png

4cc7fb1164d24f458e5bca46be6f9f3b.png

252bc6d679734667bddead773fdf4848.png

以下是我写了8个小时代码(不用星火讯飞,套用代码改了很长时间)

1、正方形图片切割成9张

6df79694f1514396aa1b1389137c8eef.png

2、六张参考图做成嵌套列表

affdab11dafa4b63a512e659a1f716cd.png

 

3、把每张图片的第一个小图合并在一起,在6个小图组合内插入空格,组合成10个一套

78662d1c9d684eed800bf404bc77e98a.png

4、把六个原始图插入表2,做样板

dbd7cb4e8fde4f38a398913234b014b4.png

e4c1a1cab5cd4afcad377de23db58ff5.png

 

代码展示

'''
立体拼图六面积木-3套图案测试

星火讯飞、通义万项
2024年7月24日
'''

from docx import Document
from docx.shared import Cm
from PIL import Image, ImageDraw, ImageFont
from PyPDF2 import PdfFileMerger, PdfFileReader
import os,time,shutil

# 你的代码逻辑

print('------1、多套6张图片切割成6*9张---------------')
def split_image(image_path, output_folder):
    image = Image.open(image_path)
    width, height = image.size
    part_width = width // 3
    part_height = height // 3

    for i in range(3):
        for j in range(3):
            part = image.crop((i * part_width, j * part_height, (i + 1) * part_width, (j + 1) * part_height))
            part.save(os.path.join(output_folder, f"{os.path.splitext(os.path.basename(image_path))[0]}_{i}_{j}{os.path.splitext(os.path.basename(image_path))[1]}"))


path = r'C:\Users\jg2yXRZ\OneDrive\桌面\立体方块拼图'
input_folder = path + r"\01图片2"
image_folder = path + r"\02切割"
os.makedirs(image_folder, exist_ok=True)


for file in os.listdir(input_folder):
    if file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')):
        image_path = os.path.join(input_folder, file)
        
        split_image(image_path, image_folder)  # 修改为传入image_path而不是image_folder

print('------2、多套6张图片作为参考图---------------')

small_image1= [f for f in os.listdir(input_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]
print(small_image1)

small_image= [small_image1[i:i +6] for i in range(0, len(small_image1),6)]

# small_image = [small_image2]
print(small_image)
print(len(small_image))
# 制作成[[],[]]的样式


print('------3、一套6张图片54张图片,把每张图片的第一张图片放在一起,插入空格,,做成列表--------------')     
# print('--------制作图片 ----------')     
# # 图片选择
image_files = [f for f in os.listdir(image_folder) if f.endswith('.jpg') or f.endswith('.png')]
print(image_files)
print(len(image_files))
# 162
# 有几套
z=int((len(image_files))/54)

# 将图片拆成9个一组
group_files = [image_files[i:i +54] for i in range(0, len(image_files),54)]
print(group_files)
print(len(group_files))
# 3
X=[]
for x in range(len(group_files)):
    xx=[]
    for x1 in range(6):
        xx.append(group_files[x][x1*9:x1*9+9])
    X.append(xx)
print(X)
print(len(X))
# 3

grouped_files1=[]  
for g in range(9):         
    for k in range(z):    # 3
        gg=[] 
        for h in range(len(X[k])): # 6
            print(h)
            gg.append(X[k][h][g])
        grouped_files1.append(gg)

print( grouped_files1)
print(len(grouped_files1))   

# 在每个子列表的第4个位置插入一个空字符串
for group in grouped_files1:
    group.insert(4, '')
    group.insert(5, '')
    group.insert(7, '')
    group.insert(9, '')

print(grouped_files1)
print(len(grouped_files1))
# 27
DD=[]
for d in range(z):
    chooice = [grouped_files1[i * z + d ] for i in range(len(grouped_files1) // z)]  
    DD.append(chooice)
   
print(DD)
print(len(DD))

grouped_files4 = [item for sublist in DD for item in sublist]
print(grouped_files4)
print(len(grouped_files4))

grouped_files3 = [item for sublist in grouped_files4 for item in sublist]
print(grouped_files3)  # 输出: []


# [[60个],[]]
grouped_files = [grouped_files3[i:i +90] for i in range(0, len(grouped_files3),90)]

print(grouped_files)
print(len(grouped_files))
# 3

#  创建临时文件夹
new_folder = path+r'\零时文件夹'
os.makedirs(new_folder, exist_ok=True)

print('------4、小图片插入插入9*10的单元格里---------------')    
# # 处理每一组图片
for group_index, group in enumerate(grouped_files):
    # 创建新的Word文档
    doc = Document(path+r'\立体方块拼图模版1页.docx')
    # print(group)
    
    # 遍历每个单元格,并插入图片
    for cell_index, image_file in enumerate(group):
        # 计算图片长宽(单位:厘米)
        print(image_file)
        # 插入图片到单元格
        table = doc.tables[0]
        cell = table.cell(int(cell_index / 10), cell_index % 10)
        # 如果第一行有4个格子,两个数字都写4
        cell_paragraph = cell.paragraphs[0]
        cell_paragraph.clear()
        run = cell_paragraph.add_run()
        if image_file !='':
            run.add_picture(os.path.join(image_folder, image_file), width=Cm(3.2), height=Cm(3.2))
        else:
            pass
        
    # 保存Word文档
    doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))
    time.sleep(5)

print('------5、参考图入1*6的单元格里---------------')   
for group_index, group in enumerate(small_image):
    # 创建新的Word文档
   
    doc = Document(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))
    print(group)
    
    # 遍历每个单元格,并插入图片
    for cell_index, image_file in enumerate(group):
        # 计算图片长宽(单位:厘米)
        print(image_file)
        # 插入图片到单元格
        table = doc.tables[1]
        cell = table.cell(int(cell_index / 6), cell_index % 6)
        # 如果第一行有4个格子,两个数字都写4
        cell_paragraph = cell.paragraphs[0]
        cell_paragraph.clear()
        run = cell_paragraph.add_run()
      
        run.add_picture(os.path.join(input_folder, image_file), width=Cm(4.7), height=Cm(4.7))
        
        # 保存Word文档
    doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))
    time.sleep(5)

print('------6、合并PDF---------------')   
# 将10个docx转为PDF
import os,time
from docx2pdf import convert
from PyPDF2 import PdfFileMerger

pdf_output_path = path+fr'\\立方体{int(len(grouped_files))}张小图{int(len(image_files)/6)}个方体.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'))
        time.sleep(5)


# 合并零时文件里所有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(3)

# 保存合并后的PDF文件
merger.write(pdf_output_path)
merger.close()


# 删除输出文件夹

shutil.rmtree(new_folder)
shutil.rmtree(image_folder)
# shutil.rmtree(new)
time.sleep(2)

本次是3套图片

1d136f3b16bc458caf208183e6d31440.png59c92aeacae142bbad1a245bf89b5c21.png

 

 

 dbd7cb4e8fde4f38a398913234b014b4.png

309ab4f589a541148d1c6985858f0e79.png

e4c1a1cab5cd4afcad377de23db58ff5.png

背景需求

下次去学校打印出来,再展示9个立方体的制作方法吧。

 

标签:02,image,grouped,70,print,path,folder,os,20240724
From: https://blog.csdn.net/reasonsummer/article/details/140671528

相关文章

  • 2024牛客暑期多校训练营3
    A.BridgingtheGap2题目大意:有n个人要划船过河(只有一艘船),每个人有\(h_i\)的体力,每次划船最少要L人,最多R人,划船要消耗船上所有人1的体力,问存不存在一种方案可以让所有人过河。思路:首先除了最后一次,前面的都需要有L人把船开回来,所以要有L人体力大于三,即可以算出一共需要\(t=\l......
  • 前端如何处理后端一次性返回10万条数据?---02
    该方法和前面方法大致相同,主要通过分页加载、虚拟滚动和数据缓存1.后端数据处理首先,确保后端在传输数据时是经过压缩的,可以大大减少传输的数据量。常见的压缩方式有Gzip或Brotli。//例如,在Node.js中使用compression中间件constcompression=require('compression');cons......
  • 2024最新一元云购源码.完美运营版.机器人自动下单.可指定中奖.一元购源码.一元夺宝源
    2024年最新云购源码一元云购H5新版本新UI 完美运行版•带易支付接口机器人自动购买•可指定中奖云购演示站:yun.6323g.com/ 源码下载链接:https://pan.baidu.com/s/1UsSE3IX_um_eAEcMIBLpHA?pwd=akjd 提取码:akjd  免责声明:该资源仅供学习和研究使用,一切关于该资源......
  • [0298]基于JAVA的保健按摩智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的保健按摩智慧管理系统的设计与实现指导老师(一)选题的背景和意义在当前社会环境下,随着人们对健康日益增长的需求以及生活节奏的加快,保健按摩行业呈现出蓬勃发展的态势。然而,传统的保健按摩企业......
  • [0297]基于JAVA的保健品进销存智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的保健品进销存智慧管理系统的设计与实现指导老师(一)选题的背景和意义【开题报告背景】在当今社会,随着国民健康意识的提升和生活质量追求的增长,保健品市场呈现出持续繁荣的发展态势。然而,伴随着......
  • [0289]基于JAVA的供应商订单智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的供应商订单智慧管理系统的设计与实现指导老师(一)选题的背景和意义选题背景与意义:随着信息技术的快速发展和广泛应用,企业在供应链管理中对效率、精准度和智能化的要求日益提高。特别是在企业采......
  • 组合数学学习笔记(一)(2024.7.3)
    一、组合数1.递推式$\displaystyle\binom{n}{m}=\displaystyle\binom{n-1}{m-1}+\displaystyle\binom{n-1}{m}$证:左边相当于从$n$个数中选$m$个数,右边枚举第$n$个数选不选。如果选,就从剩下$n-1$个数中选$m-1$个;如果不选,就从剩下$n-1$个数中选$m$个。2.对称性......
  • 2024暑假总结2
    7.22——数据结构上课+做题首先讲的是树剖。树剖核心就是根据树的一些特征(如深度、最大子树),将一棵树拆分成\(\log{n}\)个连续的树链,使得树上问题转化为线性问题,最后再用数据结构维护区间或是直接dp之类。由于我之前就比较熟悉树剖、还写过一些题,所以听得非常轻松,但是水平还......
  • 「PA2022」Medrcy
    设\(f_i\)表示第\(i\)个人知道的咒语集合,\(c_i\)为其补集,那么第\(i\)个人第\(k\)天会离开当且仅当存在一个序列\(a_{1\simk-1}\),使得\(\bigcup\limits_{j=1}^{k-1}(f_i\cupf_{a_j})=\varnothing\),即\(\bigcap_{j=1}^{k-1}(c_i\capc_{a_j})=\text{U}\)。考虑连接......
  • 「CCPC 2023 北京市赛」史莱姆工厂
    由于每次合并可以刻画为向外延伸,那么考虑区间\(\text{dp}\),设\(dp_{l,r,m,c}\)表示考虑了\([l,r]\)且剩下了一个质量为\(m\in[0,K)\)颜色为\(c\)的史莱姆的答案。状态过大且转移方程不便于优化而考虑优化状态,由于对于一个极短的需要合并成一个史莱姆的区间\([p,q]\),......