【教学类-36-12-03】20240303儿童对称正脸图(三)随机位置左脸2图+右脸2图(中班《幼儿园里朋友多》)(midjounery-v 5.1 Python图片切割)

文章讲述了如何使用Python编程,结合docx和docx2pdf库,实现随机在Word文档中插入4个格子的儿童脸部图片,其中随机出现2张左脸和2张右脸的对称布局。作者通过实例展示了从图片选择、坐标随机抽取到最终PDF文件合并的整个过程。
摘要由CSDN通过智能技术生成

作品展示

# [1, 0, 0, 1]

20f555fc30c44b8080d74349addfef87.png
# [0, 1, 1, 0]

4c754da217b544739be908b55ff2f7f4.png
#

背景需求:

1、前文完成了mj图片的生成与下载,并制作了两款4图学具——4图左脸、4图右脸

【教学类-36-12-01】20240302儿童对称正脸图(一)4图右脸+4图左脸(中班《幼儿园里朋友多》)(midjounery-v 5.1 Python图片切割)-CSDN博客文章浏览阅读346次,点赞23次,收藏19次。【教学类-36-12-01】20240302儿童对称正脸图(一)4图右脸+4图左脸(中班《幼儿园里朋友多》)(midjounery-v 5.1 Python图片切割)​编辑https://blog.csdn.net/reasonsummer/article/details/136417790icon-default.png?t=N7T8https://blog.csdn.net/reasonsummer/article/details/136417790d51444f3059945679d19c4ef95b567fb.png

88310066653c415c8617507d88ade3e1.png

2、前文完成了mj图片的生成与下载,并制作了两款4图学具——左列2图左脸+右列2图右脸

f12b6af674d04105ac7e788b4b6ee3ed.png

3、本文继续探索其他图片布局方法——随机位置左脸2图+右脸2图

4个格子中随机出现两张左脸图、两张右脸图——有六种布局

7ce4838ca2b94290ae70f9e236f8e31f.png

2d610e8348744c42ba8d28edc63ac59c.png

一、制作左脸图4张和右脸图4张

bbd0be02b0024e41893fadd1984896a0.png

word模板 ——插入2行4列,

21be18e6a3b242c4a7ca915c406aaa48.png

重点代码解析:

d926f25c84184206bc104465ec004dea.png

9cb89bd0ffd34d1b8d3782d6bc451fca.png

重点1!!!

93fb42776e22426f907f87b9de5c3723.png

196e35d8556449bdadad2ca5e02bc8e9.png

重点2!!!

2d09e897ff1a45379f1db78bca27ffe8.png

cb5e684a8a2a413d8307fe174331d71c.png

代码展示

'''
目的: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) #递归删除文件夹,即:删除非空文件夹

e2604e67e8334d53b4af77a23b51d938.png

2d5523e4f9f6448894a7f31f925bd855.png

ceb44025c8bc4a53b334cb5b7d4adb6a.png

a7c904cd571c4f768ae1a408929c4bd3.png

66397cb1dd5f48c6b2e4ee6bea4de4b5.png

随机相关样式:

随机位置‘’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]

举例:

dd10125947bc4e8fbc5d43cf177471ed.png
# [1, 0, 1, 0]

6442287495b041f7b6888af484df5d13.png
# [1, 1, 0, 0]

c967cd4c4ffb46b2815626ce4273f12c.png
# [1, 0, 0, 1]

20f555fc30c44b8080d74349addfef87.png
# [0, 1, 1, 0]

4c754da217b544739be908b55ff2f7f4.png
# [0, 1, 0, 1]

b66af4050ada45cea0379fa4588e7252.png
# [0, 0, 1, 1]

5ecee042acd4427fbdd8f9b57ad791e9.png

总览图

0d0182d423c74b95ba3bedfd42cb02a6.png

教学实践:

时间:2024年5月23日

班级:中4

人数:5人女孩(百日咳隔离)

数字:左右随机脸图片

工具:米罗可儿荧光笔(细头)

女孩们画画水平都很高,对称脸也都画了一部分,孩子们一边画,一遍笑(人物很搞笑)

孩子们画对称的脸很搞笑,并且还添加一些辅助装饰,表情等,让人物看上去更加滑稽好玩了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿夏reasonsummer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值