首页 > 其他分享 >【教学类-58-04】黑白三角拼图04(2-10宫格,每个宫格随机1张-6张,带空格纸)

【教学类-58-04】黑白三角拼图04(2-10宫格,每个宫格随机1张-6张,带空格纸)

时间:2024-05-26 14:29:02浏览次数:25  
标签:10 04 cell 400 import path margin 宫格

背景需求:

前期制作了黑白三角拼图2*2、3*3、4*4,确定了基本模板,就可以批量制作更多格子数

【教学类-58-01】黑白三角拼图01(2*2宫格)固定256种+随机抽取10张-CSDN博客文章浏览阅读522次,点赞13次,收藏16次。【教学类-58-01】黑白三角拼图01(2*2宫格)固定256种+随机抽取10张https://blog.csdn.net/reasonsummer/article/details/139173885

【教学类-58-02】黑白三角拼图02(3*3宫格)262144种-CSDN博客文章浏览阅读511次,点赞16次,收藏13次。【教学类-58-02】黑白三角拼图02(3*3宫格)262144种https://blog.csdn.net/reasonsummer/article/details/139176570【教学类-58-03】黑白三角拼图03(4*4宫格)总数算不出+随机抽取10张-CSDN博客文章浏览阅读806次,点赞25次,收藏13次。【教学类-58-03】黑白三角拼图03(4*4宫格)总数算不出+随机抽取10张https://blog.csdn.net/reasonsummer/article/details/139177898

小红书上黑白拼图的玩法时自己涂色。所以我把空白格子页也加了进去,但是目前6张图卡一页、6张空白格子一页 \6张图卡一页、6张空白格子一页 ……这样的排列方式

背景需求

'''
黑白三角2宫格-6宫格,每个宫格1分6图-6份36图
随机图片
AI对话大师,阿夏
2024年5月24日

'''
import os 
from PIL import Image, ImageDraw



for ys in range(1,7):     # 每个宫格提供几张(1张6页

    path = r'C:\Users\jg2yXRZ\OneDrive\桌面\黑白三角'
    new = path + fr'\1-10宫格组合图片'
    os.makedirs(new, exist_ok=True)
        # ys=6 # 一种2页
    f=6 # 一页6张

    b=400 # 画布大小
    # g=5 # 宫格数
    by=10 # 边距

    for a in range(1,ys+1):
        for g in range(2,11):     
            for c in range(1,f+1):
            
                # 创建bxb的画布
                canvas = Image.new('RGB', (b,b), (255, 255, 255))
                draw = ImageDraw.Draw(canvas)

                # 定义表格的行数和列数、边距
                rows = g
                cols = g
                margin = by

                # 计算单元格的宽度和高度
                cell_width = (b - 2 * margin) // cols
                cell_height = (b - 2 * margin) // rows

                # 绘制表格的竖直线
                for i in range(cols + 1):
                    x = margin + i * cell_width
                    draw.line([(x, margin), (x, b - margin)], fill=(0, 0, 0), width=2)

                # 绘制表格的水平线
                for i in range(rows + 1):
                    y = margin + i * cell_height
                    draw.line([(margin, y), (b - margin, y)], fill=(0, 0, 0), width=2)

                # 保存画布
                mb =f'{g:03d}格{a:03d}模板{c:03d}.png'
                canvas.save(new + fr'\{mb}')
            # a+=1
            

                print('---2、计算三个坐标点的黑色三角形不重复图案有几个-------')

                # 创建一个空列表用于存储单元格的坐标
                cell_coordinates = []

                # 计算每个单元格的四个顶点坐标
                for row in range(rows):
                    for col in range(cols):
                        top_left = (margin + col * cell_width, margin + row * cell_height)
                        top_right = (margin + (col + 1) * cell_width, margin + row * cell_height)
                        bottom_left = (margin + col * cell_width, margin + (row + 1) * cell_height)
                        bottom_right = (margin + (col + 1) * cell_width, margin + (row + 1) * cell_height)

                        
                        # 将四个顶点坐标添加到列表中
                        cell_coordinates.append([top_left, top_right, bottom_left, bottom_right])
                # print(cell_coordinates)
                # print(len(cell_coordinates))
                # 16
                # [[(0, 0), (400, 0), (0, 400), (400, 400)], [(400, 0), (b, 0), (400, 400), (b, 400)], [(0, 400), (400, 400), (0, b), (400, b)], [(400, 400), (b, 400), (400, b), (b, b)]]

                import random
                import os

                combinations=[]
                # 存储选取的点,随机生成坐标(样式)排除重复,生成10份样式不同的模版
                while len(combinations) < f*a:
                    selected_points = []
                    for points in cell_coordinates:
                        selected_points.append(tuple(random.sample(points, 3)))
                    combinations.append(tuple(selected_points))

                print(combinations)
                print(len(combinations))
                #  10

                print('---3、制作三个坐标点的黑色三角形(4个)-------')
                from PIL import Image, ImageDraw


                
                # 定义要绘制的坐标点组合
                for p in range(0,ys):
                    for point_combination in combinations[f*p:f*p+f]:
                        print(point_combination)
                        
                        # 清空selected_points列表
                        selected_points = []
                        h=1
                        # 遍历每个坐标点组合
                        for combination in point_combination:
                            # 从每个列表中随机选取三个点,并加入到selected_points中
                            selected_points.append(tuple(random.sample(combination, 3)))

                        # 读取图像文件
                        image = Image.open(new + f'\{g:03d}格001模板001.png')
                    
                            # 创建绘图对象
                        draw = ImageDraw.Draw(image)

                        # 遍历每个坐标点组合
                        for combination in selected_points:
                            # 绘制填充为黑色的多边形
                            draw.polygon(combination, fill="black")

                        # 保存结果图像
                        image.save(new + fr'\{g:03d}格{a:03d}图纸{c:03d}.png')
                        
                        image.close()  # 关闭图像文件
                
                    
            




    # print('---4合并打印------')


    # 第3步,读取图片写入docx,合并PDF

    import os,time
    from docx import Document
    from reportlab.lib.pagesizes import letter
    from reportlab.pdfgen import canvas
    from PyPDF2 import PdfMerger
    from docx.shared import Cm

    # 读取123文件夹中的所有图片地址
    image_folder = new
    new_folder = path+r'\零时文件夹'
    os.makedirs(new_folder, exist_ok=True)
    image_files = [os.path.join(image_folder, file) for file in os.listdir(image_folder) if file.endswith('.png')]

    # 每8个图片一组进行处理
    grouped_files = [image_files[i:i+6] for i in range(0, len(image_files), 6)]
    print(grouped_files)

    # 处理每一组图片
    for group_index, group in enumerate(grouped_files):
        # 创建新的Word文档
        doc = Document(path+r'\模板6格.docx')
        print(group)
        
        # 遍历每个单元格,并插入图片
        for cell_index, image_file in enumerate(group):
            # 计算图片长宽(单位:厘米)
        
            
            # 插入图片到单元格
            table = doc.tables[0]
            cell = table.cell(int(cell_index / 2), cell_index % 2)
            # 6列两个都是6
            cell_paragraph = cell.paragraphs[0]
            cell_paragraph.clear()
            run = cell_paragraph.add_run()
            run.add_picture(image_file, width=Cm(9.4), height=Cm(9.4))
            
        # 保存Word文档
        doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))
        

    # 所有docx合并成PDF

    # 将10个docx转为PDF
    import os
    from docx2pdf import convert
    from PyPDF2 import PdfFileMerger
    # from PyPDF4 import PdfMerger

    # output_folder = output_folder

    pdf_output_path = path+fr'\黑白三角1-10宫格随机每款{f*ys}图共{ys}张.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()

    import shutil
    # 删除输出文件夹
    import time
    shutil.rmtree(new_folder)
    shutil.rmtree(new)
    time.sleep(2)

2*2宫格的抽取6张,3*3宫格抽取6张……9*9宫格抽取6张,6张图正好一页A4

因为数量多,所以生成时间很长。

标签:10,04,cell,400,import,path,margin,宫格
From: https://blog.csdn.net/reasonsummer/article/details/139201646

相关文章

  • 软件工程日报040
     第一天第二天第三天第四天第五天所花时间(包括上课) 5h    代码量(行) 400    博客园(篇) 1    所学知识 TMP制作中文字体    ......
  • 软件工程日报041
     第一天第二天第三天第四天第五天所花时间(包括上课) 2.5h    代码量(行) 140    博客园(篇) 1    所学知识 创建对话框的UI界面    ......
  • [UDS诊断 03- 诊断会话控制(0x10)]-深度解读
     1.诊断会话       诊断会话模式由诊断服务层用于访问受限于特定会话的不同诊断服务。节点需要支持若干会话模式,如下所示:诊断会话定义    非默认会话启动时,控制器应启动S3_server定时器。如果在这个时间范围内没有从任何一......
  • [UDS诊断 04-控制器复位(0x11)]
    目录1.服务描述2.请求报文格式 3.肯定响应报文格式1.服务描述    该服务请求控制器根据复位类型参数值的内容有效地执行控制器重置。执行控制器重置后,默认会话是激活的。    通常来说,ECU在收到一条诊断指令后要先执行相应诊断处理,完毕后再发......
  • 视频号创作者分成5.0,最新方法,条条爆款,简单无脑,单日变现1000+
    福利来了,微信视频号分成计划正式推出啦!这是微信平台为鼓励优质原创内容创作而推出的一项激励机制。通过这个计划,内容创作者可以通过发布原创视频,吸引用户观看并在评论区互动,从而获得广告分成收益。这种模式类似于公众号的文字内容变现,但视频号专注于视频内容。这意味着,只要......
  • CF1089I Interval-Free Permutations
    标签:析合树析合树就是用来处理这一种值域连续段的问题的。OI-wiki上对于析合树的讲解。我们回顾一下题目,要求不存在长度为\([2,n-1]\)之间的连续段,换句话说,就是根节点下恰有\(n-1\)个节点,且没有任何一个字段是题目中要求的连续段。我们记这样的答案为\(A_n\)也就......
  • 【ArcGIS微课1000例】0112:沿线(面)按距离或百分比生成点
    文章目录一、沿线生成点工具介绍二、线状案例三、面状案例一、沿线生成点工具介绍位置:工具箱→数据管理工具→采样→沿线生成点摘要:沿线或面以固定间隔或百分比创建点要素。用法:输入要素的属性将保留在输出要素类中。向输出要素类添加新字段ORIG_FID,并设置为......
  • 【QGIS入门实战精品教程】10.7: 基于DEM的地形因子分析(坡度、坡向、粗糙度、山体阴影、
    文章目录一、加载dem二、山体阴影三、坡度四、坡向五、地形耐用指数六、地形位置指数七、地表粗糙度一、加载dem二、山体阴影方法一:符号系统利用符号系统中的山体阴影,渲染出阴影效果。方法二:山体阴影工具该算法计算输入中的数字化地形模型的山体阴......
  • (免费领源码)Java/Mysql数据库+53102互联网美食分享平台,计算机毕业设计项目推荐上万套实
    springboot互联网互联网美食分享平台系   院XXXX学科门类XXX专   业 XXX班级XXX学   号XXX姓   名XXX指导菜谱大全 XXX菜谱大全职称XXX2023年2月摘 要大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化......
  • 给程序员的10堂写作课(一)--30+的你,怎能错过写作?
     你是否在职场打拼多年,却始终原地踏步,为升职无望而焦虑?你是否在风云变幻的环境中,整日提心吊胆,不知道何时会被裁员?你是否正步入35+的行列,面临年龄危机,心生恐惧?如果你正被这些问题所困扰,又苦无对策,那么不妨尝试写作吧。 1写作是倒逼自己成长最快的方式 富兰克林曾说:“写作......