作品展示
# [1, 0, 0, 1]
# [0, 1, 1, 0]
#
背景需求:
1、前文完成了mj图片的生成与下载,并制作了两款4图学具——4图左脸、4图右脸
2、前文完成了mj图片的生成与下载,并制作了两款4图学具——左列2图左脸+右列2图右脸
3、本文继续探索其他图片布局方法——随机位置左脸2图+右脸2图
4个格子中随机出现两张左脸图、两张右脸图——有六种布局
一、制作左脸图4张和右脸图4张
word模板 ——插入2行4列,
重点代码解析:
重点1!!!
重点2!!!
代码展示
'''
目的:A4横版 一页4个半脸(4个人物,4个坐标,随机出现左脸2个或者右脸2个 分别靠左靠右)
时间:2024年3月3日17:27
# '''
num=int(input('生成几份?\n'))
print('----------第1-1步:提取所有的幼儿照片的路径------------')
import os
p=r"C:\Users\jg2yXRZ\OneDrive\桌面\儿童正脸"
tall=['04左脸图','05右脸图']
path=[]
for t3 in range(len(tall)):
p1=p+r'\{}'.format(tall[t3])
print(p1)
imgs=os.listdir(p1)
for img in imgs:
if img.endswith(".png"):
path.append(p1+'\\'+img)
print(path)
print(len(path))
# 50张图
s=int(len(path)/2)
# 25个一组
pathall=[]
for t4 in range(int(len(path)/s)):
pathall.append(path[t4*s:t4*s+s])
print(pathall)
print(len(pathall))
# [[左脸图25个],[有脸图25个],]
print('----------第-2步:坐标提取 8个坐标分成4组 2个坐标中间随机抽取------------')
bg=[]
for x in range(0,2):
# zb=int('{}'.format(t3))
for y in range(0,4):
bg.append('{}{}'.format('%02d'%x,'%02d'%y))
print(bg)
# ['0000', '0001', '0002', '0003', '0100', '0101', '0102', '0103']
bgall=[]
tt=int(len(bg)/4)
for t5 in range(int(len(bg)/tt)):
bgall.append(bg[t5*tt:t5*tt+tt])
print(bgall)
print(len(bgall))
# [['0000', '0001'], ['0002', '0003'], ['0100', '0101'], ['0102', '0103']]
print('----------第2步:新建一个临时文件夹------------')
# 新建一个”装N份word和PDF“的文件夹
imagePath1=p+r'\零时Word'
if not os.path.exists(imagePath1): # 判断存放图片的文件夹是否存在
os.makedirs(imagePath1) # 若图片文件夹不存在就创建
print('----------第3步:随机抽取4张图片 ------------')
import docx
from docx import Document
import random
import os,time
from docx.shared import Inches,Cm,Pt
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
# # from docx.enum.text import WD_VERTICAL_ALIGNMENT
# from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT #用来设置单元格垂直对齐方式
from docx.oxml.ns import qn
from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor
for nn in range(0,num): # 读取图片的全路径 的数量 31张
doc = Document(p+r'\对称脸.docx')
# 随机抽取4个坐标,判断是位置0还是1的坐标
bgs=[]
index = []
while True:
for xx in range(len(bgall)):
big=random.sample(bgall[xx],1)
for f in big:
bgs.append(f)
dex = bgall[xx].index(f)
index.append(dex)
print(bgs)
print(index)
# ['0001', '0002', '0100', '0102']
# [1, 0, 0, 0]
# ['0000', '0002', '0100', '0102']
# [0, 0, 0, 0]
# ['0001', '0003', '0101', '0103']
# [1, 1, 1, 1]
# ['0000', '0002', '0100', '0103']
# [0, 0, 0, 1]
# ['0000', '0003', '0100', '0102']
# [0, 1, 0, 0]
# ['0001', '0003', '0101', '0102']
# [1, 1, 1, 0]
# ['0001', '0002', '0100', '0103']
# [1, 0, 0, 1]
if sum(index) != 2:
# 如果[1, 1, 1, 0]合计不等于2,就继续循环生成一个
bgs = []
index = []
continue
else:
# 如果[1, 0, 0, 1]合计等于2,就中断循环
break
# 默认抽取 先 左图2张,后 右图2张 【左,左,右,右】=0,0,1,1
figure=[]
for xx in range(len(pathall)): # [[],[]]里面的每个【】里面的25个里面抽取2个
fig=random.sample(pathall[xx],2) # 随机抽取4个图片
# print(fig)
for g in fig:
figure.append(g)
print(figure)
# 其中的左脸图代表0.右脸图代表1,请按照[0, 1, 1, 0]方式,将路径重新排列(AI对话大师生成)
left_face_paths = [figure[i] for i in range(len(figure)//2)]
right_face_paths = [figure[i] for i in range(len(figure)//2, len(figure))]
# index = [0, 1, 1, 0]
figures = []
for i in index:
if i == 0:
figures.append(left_face_paths.pop(0))
else:
figures.append(right_face_paths.pop(0))
print(figures)
table = doc.tables[0]
for t in range(len(bgs)): # 02
pp=int(bgs[t][0:2])
qq=int(bgs[t][2:4])
k=figures[t]
n=index[t] # 索引的数字,0或1
print(pp,qq,k)
# 写入1张大图
run=doc.tables[0].cell(pp,qq).paragraphs[0].add_run() # # 图片位置 第一个表格的0 3 插入照片
run.add_picture(r'{}'.format(k),width=Cm(5.00),height=Cm(9.9))
if n==0 : # 0是左侧插图
table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
if n==1: # 1是右侧插图
table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT #居中
doc.save(imagePath1+r'\{}.docx'.format('%02d'%nn))
# 19份docx合并成1个pdf
import os
from docx2pdf import convert
from PyPDF2 import PdfMerger
# 获取docx文件列表
docx_files = os.listdir(imagePath1)
docx_files = [f for f in docx_files if f.lower().endswith('.docx')]
docx_files = docx_files[:] # 只处理前10个docx文件 所有文件都处理
# 将docx文件转换为PDF
pdf_files = []
for docx_file in docx_files:
docx_path = os.path.join(imagePath1, docx_file)
pdf_file = docx_file[:-5] + '.pdf'
pdf_path = os.path.join(imagePath1, pdf_file)
convert(docx_path, pdf_path)
pdf_files.append(pdf_path)
# 合并PDF文件
merger = PdfMerger()
for pdf_file in pdf_files:
merger.append(pdf_file)
# 保存合并后的PDF文件
output_file = os.path.join(p, '(打印)儿童脸部对称图--随机出现2张左图+2张右图({}份).pdf'.format(num))
merger.write(output_file)
merger.close()
print('合并完毕,结果保存在{}'.format(p))
# # print('----------第5步:删除临时文件夹------------')
import shutil
shutil.rmtree(imagePath1) #递归删除文件夹,即:删除非空文件夹
随机相关样式:
随机位置‘’1100四个数字‘’一共有6种排列方法
# [1, 1, 0, 0]各种配列方法,不重复
from itertools import permutations
lst = [1, 1, 0, 0]
permutations_set = set(permutations(lst))
for permutation in permutations_set:
print(list(permutation))
# [1, 0, 1, 0]
# [1, 1, 0, 0]
# [1, 0, 0, 1]
# [0, 1, 1, 0]
# [0, 1, 0, 1]
# [0, 0, 1, 1]
举例:
# [1, 0, 1, 0]
# [1, 1, 0, 0]
# [1, 0, 0, 1]
# [0, 1, 1, 0]
# [0, 1, 0, 1]
# [0, 0, 1, 1]
总览图