【教学类-58-03】黑白三角拼图03(4*4宫格)总数算不出+随机抽取10张

背景需求:

【教学类-58-01】黑白三角拼图01(2*2宫格)256种-CSDN博客文章浏览阅读318次,点赞10次,收藏12次。【教学类-58-01】黑白三角拼图01(2*2宫格)256种https://blog.csdn.net/reasonsummer/article/details/139173885

【教学类-58-02】黑白三角拼图02(3*3宫格)262144种-CSDN博客文章浏览阅读136次,点赞7次,收藏7次。【教学类-58-02】黑白三角拼图02(3*3宫格)262144种https://blog.csdn.net/reasonsummer/article/details/139176570?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139176570%22%2C%22source%22%3A%22reasonsummer%22%7D

 我尝试过2*2是256,3*3是262114,  想制作 4*4。

4*4的的排列方式太多了,程序内存不够计算。出现MomeryError,只能放弃。

代码(内存不够计算)

'''
黑白三角(4*4), 16个单元格每个有四个坐标,四个坐标随机抽取3个,进行组合,共有262144种不重复排序,带边距
因为有26万种,所以把图片做的90,但是太多了,无法计算
像素小一点  生成时间15:34-16:02
AI对话大师,阿夏
2024年5月24日

'''


from PIL import Image, ImageDraw

b=90
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\黑白三角'

# 创建bxb的画布
canvas = Image.new('RGB', (b,b), (255, 255, 255))
draw = ImageDraw.Draw(canvas)

# 定义表格的行数和列数
rows = 4
cols = 4
margin = 5

# 计算单元格的宽度和高度
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 = '4格模板.png'
canvas.save(path + 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)
# [[(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 itertools,os

# 生成所有组合方式
combinations = list(itertools.product(*[itertools.combinations(sublist, 3) for sublist in cell_coordinates]))
# print(combinations)
print(len(combinations))
# 262144


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

new=path+r'\四宫格组合图片'
os.makedirs(new,exist_ok=True)

m=1
# 定义要绘制的坐标点组合
for point_combination in combinations:
        # 读取图像文件
    image = Image.open(path+fr'\{mb}')

    # 创建绘图对象
    draw = ImageDraw.Draw(image)

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

    # 保存结果图像
    image.save(new+fr"\{m:06d}.png")
    m+=1


# print('---4合并打印-26万张就不生成卡片了------')


# # 第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}.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'\黑白三角三宫格26万(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'))


# # 合并零时文件里所有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
# # 删除输出文件夹

# shutil.rmtree(new_folder)

因此需要我想随机抽取10张4*4的图片,但要保证随机抽的图案不能相同)

'''
黑白三角(4*4), 16个单元格每个有四个坐标,四个坐标随机抽取3个,进行组合,自动抽取10张,带边距
随机图片
AI对话大师,阿夏
2024年5月24日

'''


from PIL import Image, ImageDraw
f=10 # 需要10份
b=800 # 画布大小
g=4 # 宫格数
by=50 # 边距

path = r'C:\Users\jg2yXRZ\OneDrive\桌面\黑白三角'

# 创建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}格模板.png'
canvas.save(path + 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


# # 生成所有组合方式,太多了,生成不出来
# combinations = lisitertools.product(*[itertools.combinations(sublist, 3) for sublist in cell_coordinates]))
# # print(combinations)
# print(len(combinations))
# # 262144


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

new = path + fr'\{g}宫格组合图片'
os.makedirs(new, exist_ok=True)

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

    # 读取图像文件
    image = Image.open(path + fr'\{mb}')

    # 创建绘图对象
    draw = ImageDraw.Draw(image)

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

    # 保存结果图像
    image.save(new + fr"\{m:03d}.png")
    image.close()  # 关闭图像文件
    m += 1



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}.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'\黑白三角{g}宫格随机{f}张(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'))


# 合并零时文件里所有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
# 删除输出文件夹

shutil.rmtree(new_folder)

4*4样式数以亿计算,所以只能随机抽一些不重复的图案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/638233.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数组-求和为k的连续子数组

一、题目描述 二、题目思路 这里注意&#xff1a;题目要求时间、空间复杂度都为O(n)&#xff0c;所以不能直接通过双层循环来暴力解(时间复杂度为O&#xff08;n&#xff09;)&#xff0c;可以使用Map实现。 1. 遍历数组计算sum(i)&#xff0c;Map记录sum值第一次出现的位置&…

STM32 MAP文件结合固件文件分析

文章目录 加载域的结束地址并不是固件的结束地址&#xff1f;ROM中执行域的描述RAM中执行域的描述问题分析 中断向量表在固件中的存储位置代码段在固件中的位置只读数据Regin$$Table RW Data段其中的内部机理 总结 MAP 文件分析可以参考之前的文章 程序代码在未运行时在存储器…

LeetCode刷题之HOT100之多数元素

2024/5/21 起床走到阳台&#xff0c;外面绵柔细雨&#xff0c;手探出去&#xff0c;似乎感受不到。刚到实验室&#xff0c;窗外声音放大&#xff0c;雨大了。昨天的两题任务中断了&#xff0c;由于下雨加晚上有课。这样似乎也好&#xff0c;不让我有一种被强迫的感觉&#xff0…

SpringCloud Alibaba Nacos分类配置--多方案配置隔离

文章目录 Nacos 分类配置(实现配置隔离)1.DataID 方案需求分析/图解配置实现测试 2.Group 方案需求分析/图解配置实现修改application.yml修改bootstrap.yml测试 3.Namespace 方案需求分析/图解配置实现修改application.yml修改bootstrap.yml测试 Namespace/Group/Data ID 关系…

基于springboot+vue+Mysql的逍遥大药房管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

EfficientSAM分割对象后求其中图像中的高

1 分割对象 EfficientSAM https://github.com/yformer/EfficientSAM 2 计算在图像中最高点即y值最小点 import os import cv2def read_images(folder_path):image_files [f for f in os.listdir(folder_path) iff.endswith(".jpg") or f.endswith(".png&quo…

文心智能体-恋爱专家

⭐简单说两句⭐ ✨ 正在努力的小叮当~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &a…

邮件系统数据面临的安全问题及解决方法

随着电子邮件的普及&#xff0c;邮件系统已成为企业、学校、个人等用户之间进行信息交流的重要工具。然而&#xff0c;随着数据量的增加和用户对邮件系统的依赖&#xff0c;邮件系统数据安全问题也逐渐凸显。下面U-Mail技术张工就给大家讲解一下邮件系统数据面临的主要安全问题…

CCF-GESP 等级考试 2023年9月认证C++四级真题

2023年9月 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 第 1 题 ⼈们所使⽤的⼿机上安装的App通常指的是&#xff08; &#xff09;。 A. ⼀款操作系统B. ⼀款应⽤软件C. ⼀种通话设备D. 以上都不对 第 2 题 下列流程图的输出结果是&#xff1f;( ) A. 9B.…

【30天精通Prometheus:一站式监控实战指南】第4天:node_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

搜索插入位置 ---- 二分查找

题目链接 题目: 分析: 因为数排序数组, 所以具有"二段性", 可以使用二分查找题目中, 我们如果找到目标值 , 则返回下标, 如果没找到目标值, 应该返回的是>target的第一个位置, 所以应该将数组分成< target 和 > target当<target时, 应该移动left, left…

3DMax

先转换为可编辑多边形 按“1”选择为点&#xff0c;点击目标焊接&#xff08;CtrlShiftw&#xff09;&#xff0c;然后点击一个顶点拉到另一个定点上&#xff1b; 选择一个面&#xff0c;点击塌陷&#xff08;CtrlAltC&#xff09;&#xff0c;四点合并为一个点&#xff1b; …

《艺术大观》知网艺术刊:可加急, 出刊上网快

《艺术大观》 《艺术大观》征文通知 《艺术大观》期刊诚邀学者、艺术家和文化工作者积极投稿&#xff0c;共同探索艺术领域的前沿问题&#xff0c;促进学术交流和艺术创作的发展。我们欢迎各类艺术形式的研究与评论&#xff0c;包括但不限于绘画、雕塑、音乐、舞蹈、戏剧、电…

代码随想录算法训练营第三十四天 | 理论基础、455.分发饼干、376、摆动序列、53.最大子序和

目录 理论基础 455.分发饼干 思路 代码 376.摆动序列 思路 代码 53.最大子序和 思路 代码 理论基础 代码随想录 455.分发饼干 代码随想录 思路 可以是大饼干优先满足大胃口&#xff0c;也可以是小饼干优先满足小胃口。 代码 class Solution:def findContentChildre…

springsecurity入门登录授权

①我们需要自定义登陆接口&#xff0c;也就是在controller目录新建LoginController类&#xff0c;在controller方法里面去调用service接口&#xff0c;在service接口实现AuthenticationManager去进行用户的认证&#xff0c;注意&#xff0c;我们定义的controller方法要让Spring…

在Windows操作系统中克隆SD卡的简单方法!

如今&#xff0c;在数据备份和传输方面&#xff0c;SD卡克隆软件发挥着重要作用。本文将向大家介绍一款好用的Windows SD卡克隆软件&#xff0c;可以帮助你轻松将数据克隆到新卡中。 为什么需要在Windows中进行SD卡克隆&#xff1f; 在许多情况下&#xff0c;你可能需要将SD卡…

react中怎么为props设置默认值

在React中&#xff0c;你可以使用ES6的类属性&#xff08;class properties&#xff09;或者函数组件中的默认参数&#xff08;default parameters&#xff09;来定义props的默认值。 1.类组件中定义默认props 对于类组件&#xff0c;你可以在组件内部使用defaultProps属性来…

css左右滚动互不影响

想实现左右都可以滚动&#xff0c;且互不影响。 只需要再左边的css里面 .threedlist {cursor: pointer;width: 280px;position: fixed;height: 100vh; /* 定义父容器高度 */overflow-y: auto; /* 只有在内容超过父容器高度时才出现滚动条 */} 如果想取消滚动条样式 .threedli…

【NumPy】关于numpy.reshape()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

AI视频教程下载:用ChatGPT和React.js开发AI聊天机器人

这门课程面向初出茅庐的开发者和技术爱好者&#xff0c;深入探讨了使用两种强大工具&#xff1a;React.js 和 OpenAI 的 ChatGPT 的人工智能聊天机器人开发的迷人世界。通过注重实践、动手学习&#xff0c;该课程引导您完成创建动态、人工智能驱动的聊天机器人应用程序的每一步…