背景需求:
已知黑白三角拼圖2*2(4個拼圖)一共有256種排列方法
【教學類-58-01】黑白三角拼圖01(2*2宮格)256種-CSDN博客文章瀏覽閱讀142次,點贊5次,收藏12次。【教學類-58-01】黑白三角拼圖01(2*2宮格)256種https://blog.csdn.net/reasonsummer/article/details/139173885?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139173885%22%2C%22source%22%3A%22reasonsummer%22%7D
接下去做黑白三角拼圖3*3(9個拼圖)一共有有262144種排列方法(26萬),
為了生成快一點,圖片大小是170*170,1.46KB,很小很小。
因為26萬張太多了,所以不制作PDF了,如果需要做PDF,建議還是改成300*300
代碼展示
'''
黑白三角(3*3), 9個單元格每個有四個坐標,四個坐標隨機抽取3個,進行組合,共有#262144種不重復排序,帶邊距
因為有26萬種,所以把圖片做的150像素小一點 生成時間15:34-16:02
AI對話大師,阿夏
2024年5月24日'''from PIL import Image, ImageDrawb=180
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\黑白三角'# 創建bxb的畫布
canvas = Image.new('RGB', (b,b), (255, 255, 255))
draw = ImageDraw.Draw(canvas)# 定義表格的行數和列數
rows = 3
cols = 3
margin = 10# 計算單元格的寬度和高度
cell_width = (b - 2 * margin) // cols
cell_height = (b - 2 * margin) // rows# 繪制表格的豎直線
for i in range(cols + 1):x = margin + i * cell_widthdraw.line([(x, margin), (x, b - margin)], fill=(0, 0, 0), width=2)# 繪制表格的水平線
for i in range(rows + 1):y = margin + i * cell_heightdraw.line([(margin, y), (b - margin, y)], fill=(0, 0, 0), width=2)# 保存畫布
mb = '3格模板.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))
# 262144print('---3、制作三個坐標點的黑色三角形(4個)-------')
from PIL import Image, ImageDrawnew=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)