【教学类-58-14】黑白三角拼图12——单页1页图。参考图1页6张(黑白、彩色)、板式(无圆点、黑圆点、白圆点)、宫格2-10、张数6张,适合集体操作)

背景需求:

基于以下两个代码,设计一个单页1页黑白三角、彩色三角(包含黑点、白点、无点)的代码。

【教学类-58-12】黑白三角拼图10(N张参考图+1张操作卡+多张彩色白块,适合个别化)-CSDN博客文章浏览阅读888次,点赞27次,收藏7次。【教学类-58-12】黑白三角拼图10(N张参考图+1张操作卡+多张彩色白块,适合个别化) https://blog.csdn.net/reasonsummer/article/details/146476754?spm=1011.2415.3001.5331【教学类-58-13】黑白三角拼图11——左右结构图、一页三张,颜色(黑白、彩色)、板式(无圆点、黑圆点、白圆点)、宫格起止数、张数,适合集体操作)-CSDN博客文章浏览阅读517次,点赞11次,收藏10次。【教学类-58-13】黑白三角拼图11——左右结构图、一页三张,颜色(黑白、彩色)、板式(无圆点、黑圆点、白圆点)、宫格起止数、张数,适合集体操作) https://blog.csdn.net/reasonsummer/article/details/146500374?spm=1011.2415.3001.5331

单页1页的黑白三角(包含黑点、白点、无点)

'''


彩色三角图,2宫格36张,3宫格36张……适合个别化 大操作卡
01彩色三角 1页1图大操作图 彩色块 无空心点 
1、选择颜色:彩色
2、黑点、白点、无点
3、随机图片
AI对话大师,阿夏
2025年3月26日

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


path = r'C:\Users\jg2yXRZ\OneDrive\桌面\20250323黑白三角图案版(彩色)'

# 起始宫格数
start=int(input('开始宫格数,如2\n'))
# 最大宫格数
end=int(input('截止宫格数,如10\n'))

# 黑白或彩色


style=['0无圆点','1黑圆点','2白圆点']
s=int(input('请选择:0:无圆点,1:黑圆点,2:白圆点\n'))


# 1张(3张)=1,2
zhang=int(input('每种宫格生成多少张(一张有3份左右对称的?)比如:6张\n'))


colors=['black','black']
# 选择颜色:0黑白、1彩色


for gongge in range(start,end+1): # 遍历3宫格到10宫格
    for ys in range(zhang,zhang+1):
      
        new = path + fr'\{gongge:02}宫格组合图片'
        os.makedirs(new, exist_ok=True)

        newall=path+r'\02单页拼图'
        os.makedirs(newall,exist_ok=True)
        
        radius = 5
        f = 6 * ys  # 一页6张

        b = 400  # 画布大小
        by = 10  # 边距

        print('----------1\制作白色操作图------------')
        for g in range(gongge,gongge+1):
            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)

                # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形
                
                for i in range(rows):
                    for j in range(cols):
                        left = margin + j * cell_width
                        upper = margin + i * cell_height
                        right = left + cell_width
                        lower = upper + cell_height
                       # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形
            
           
                        if s==0:  # 无圆点,纯黑线
                            pass
                        elif s==1: # 绘制黑色小圆点
                            draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                        fill=('black'), width=5)
                        else:   # # 绘制白色小圆点
                            draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                        fill='white', outline='black', width=1)


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

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


                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:
                    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 point_combination in combinations:
                    print(point_combination)
                    
                    # 清空selected_points列表
                    selected_points = []
                    h=1
                    # 遍历每个坐标点组合
                    for combination in point_combination:
                        # 从每个列表中随机选取三个点,并加入到selected_points中
                        selected_points.append(tuple(random.sample(combination, 3)))

                            # 读取图像文件
    #                创建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)
                    
                    
                

                    # # color=['black','black']
                    # color=['red','yellow','orange','blue','green','purple','pink']
                    color=colors
                    # 遍历每个坐标点组合
                    for combination in selected_points:
                        # 绘制填充为黑色的多边形
                    
                        # draw.polygon(combination, fill='black',outline=(255, 255, 255), width=1)
                        draw.polygon(combination, fill=random.choice(color), outline=('black'), width=2)

                       
                    for i in range(rows):
                        for j in range(cols):
                            left = margin + j * cell_width
                            upper = margin + i * cell_height
                            right = left + cell_width
                            lower = upper + cell_height

                    
                        if s==0:  # 无圆点,纯黑线
                            pass
                        elif s==1: # 绘制黑色小圆点
                            draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                        fill=('black'), width=5)
                        else:   # # 绘制白色小圆点
                            draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                        fill='white', outline='black', width=1)

        

                    # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形
                
                    # 保存结果图像
                    canvas.save(new + fr'\{g:05d}格{c:05d}01图纸{c:05d}.png')
                    
                    canvas.close()  # 关闭图像文件
        
                            
        

        print('----4、贴图用黑色色块----------')
        canvas = Image.new('RGB', (b, b), (255, 255, 255))
        draw = ImageDraw.Draw(canvas)

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

        for i in range(rows + 1):
            y = margin + i * cell_height
            draw.line([(margin, y), (b - margin, y)], fill='black', width=2)

        # 在每个单元格中绘制两个三角形
        for row in range(rows):
            for col in range(cols):
                left = margin + col * cell_width
                upper = margin + row * cell_height
                right = left + cell_width
                lower = upper + cell_height              

                
                # 随机选择三个顶点坐标
                points = [(left, upper), (right, upper), (left, lower), (right, lower)]
                # random.shuffle(points)
                triangle1 = tuple(points[0:3])
                triangle2 = tuple(points[1:4])

                draw.polygon(triangle1, fill='black',outline='black',width=2)
                draw.polygon(triangle2, fill='white',outline='white',width=2)

        # 设置边框线为黑色
        draw.line([(margin, margin), (b - margin, margin), (b - margin, b - margin), (margin, b - margin), (margin, margin)], fill='black', width=2)

           
        for i in range(rows):
            for j in range(cols):
                left = margin + j * cell_width
                upper = margin + i * cell_height
                right = left + cell_width
                lower = upper + cell_height
                if s==0:  # 无圆点,纯黑线
                    pass
                elif s==1: # 绘制黑色小圆点
                    draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                fill=('black'), width=5)
                    draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                fill=('black'), width=5)
                    draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                fill=('black'), width=5)
                    draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                fill=('black'), width=5)
                else:   # # 绘制白色小圆点
                    draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                fill='white', outline='black', width=1)
                    draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                fill='white', outline='black', width=1)
                    draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                fill='white', outline='black', width=1)
                    draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                fill='white', outline='black', width=1)


        # 保存结果图像
        canvas.save(new + fr'\{g:05d}格黑块.png')
        canvas.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


        print('---5参考图合并-----')
        # 读取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')]

        new1=path+r'\保存1'
        os.makedirs(new1, exist_ok=True)

        # 每8个图片一组进行处理
        grouped_files = [image_files[:-2][i:i+6] for i in range(0, len(image_files[:-2]), 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 = new1+fr'\02黑白三角{g:02d}宫格参考图.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(3)


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


        print('---6答题卡合并(白图和黑三角卡片-----')
        # 读取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.lis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值