效果展示:
单页效果
多页效果
预设效果
背景需求:
2022年11月23日,作为艺术特色幼儿园,蒙德里安风格装饰在我们幼儿园的环境中。
蒙德里安是几何抽象画派的先驱,以几何图形为绘画的基本元素,与德士堡等创立了“风格派”,提倡自己的艺术“新造型主义”。他认为艺术应根本脱离自然的外在形式,以表现抽象精神为目的,追求人与神统一的绝对境界,也就是现在我们熟知的“纯粹抽象”。
《大块红色、黄色、黑色、灰色和蓝色的构成》布面油画1921达拉斯艺术博物馆藏
以前指导孩子们临摹过上面这幅画,孩子们画的还不错。这次我想随机生成一些不同的线条框架,让幼儿根据不同的线条组成的大小块面,自行尝试填色(色彩涂色符合幼儿的绘画能力特点)。
制作随机线条画有点难度,我参考了很多CSDN上的“蒙德里安”代码,要么看不懂,要么不符合我的需求。最终找到了“https://blog.csdn.net/qq_45027465/article/details/125315445”(随机绘画图形)的代码,通过反复测试,修改参数,基本满足了我需要的黑线格子样式。
WORD模板设置
分栏,左边是参考图片和一副空白七巧板,右边是帖七巧板的画框位置。
页边距l:上下左右1CM
1、插入2*2表格,高度宽度如图
2、空一行
3、插入 分开来的七巧板(PPT自制)
插入形状-用直角三角形、正方形、平行四边形。照着彩色的图片一块块拼上去,然后稍微拉开空一点距离。
把左侧的纯图片复制到WORD内部
Word模板终于做完了T_T
运行代码:
'''
作者:阿夏
时间:2022年11月23日蒙德里安)
(A4横版,左边第一个18*18的蒙德里安图片))
'''
# 代码出处:https://blog.csdn.net/qq_45027465/article/details/125315445
import matplotlib.pyplot as plt
import matplotlib.patches as pch
import matplotlib.tri as tri
import numpy as np
import random
from cv2 import cv2
import os
import gc
print('-----------------第1部分:生成蒙德里安线正方形线条图-------------------')
n=int(input('请输入画布尺寸正方形(18Cm)\n'))
nn=int(input('一共要几张图(30)\n'))
figLong = n # 的长k
figWide = n # 的宽
color = ['b', 'r', 'g', 'y', 'c', 'm','w','k']# 蓝色,红色、绿色、黄色、青、品红、白、黑
def FigRect(ax,num): # 画矩形
# 以下代码是做随机矩形。
for i in range(num):
# l=figLong
# w=figWide
long = random.uniform(figLong,figLong*5) # 矩形的长为0.5-3之间
wide = random.uniform(figWide,figWide*5) #
X = random.uniform(0, figLong - long)
Y = random.uniform(0, figWide - wide)
# X =figLong - long
# Y =figWide - wide
a = random.randint(7, 7) # 0,0蓝色 11红 22绿 33黄 44浅蓝、55浅紫 66白 77黑 # 线条色彩,这里只用7,黑色
rect = pch.Rectangle(xy=(X, Y), width=wide, height=long, edgecolor=color[a], facecolor=color[a], fill=False,
linewidth=20) # 线条宽度
ax.add_patch(rect)
# 下面代码是做画框的边框(18*18)
rect1 = pch.Rectangle(xy=(0, 0), width=figWide, height=figLong, edgecolor=color[a], facecolor=color[a], fill=False,
linewidth=20) # 线条宽度
ax.add_patch(rect1)
if num != 0:
del ax, rect
gc.collect()
def main():
figNum = nn # 画图数量
imgNum = 80 # 每张图的图形最多数量
for i in range(figNum):
fig, ax = plt.subplots(figsize=(figLong, figWide))
a = random.randint(1, 1)# 0,0=黑色背景 1,1白色背景
if a == 0:
X = np.arange(0, figLong, 20)
plt.fill_between(X, 0, figWide, color='k')
for j in range(0,imgNum):
b = random.randint(0, 0)
# b=3
if b==0:
FigRect(ax, 1) # 图形粗密
name = 'C:/Users/jg2yXRZ/OneDrive/桌面/蒙德里安/线条图/' + str(i) + '.jpg'
plt.xlim(xmin=0, xmax=figLong)
plt.ylim(ymin=0, ymax=figWide)
plt.axis('off')
plt.subplots_adjust(top=1, bottom=0, left=0, right=1, hspace=0, wspace=0)
plt.margins(0, 0)
plt.savefig(name, dpi=30)
# plt.show() # 只显示一次,并且不能自动关闭
plt.clf()
plt.close()
del fig, ax
gc.collect()
# 模拟按键Alt+F4
# plt.pause(1)
if __name__ == '__main__':
main()
print('-----------------第2部分:导入Word,合成PDF-------------------')
import os,random
print('----------第1步:提取所有的蒙德里安线条图的路径------------')
path=[]
for i in range(0,nn): # 一共有18张
p=r"C:\Users\jg2yXRZ\OneDrive\桌面\蒙德里安\线条图\{}.jpg".format(i)
path.append(p)
print(path)
# ['C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\1.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\2.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\3.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\4.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\5.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\七巧
# 板\\线条图\\6.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\7.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\8.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\9.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\10.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\11.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\12.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\13.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\14.jpg',
# 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\15.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\16.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图
# \\17.jpg', 'C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\蒙德里安\\线条图\\18.jpg']
print('----------第2步:新建一个临时文件夹------------')
# 新建一个”装N份word和PDF“的文件夹
os.mkdir(r'C:\Users\jg2yXRZ\OneDrive\桌面\蒙德里安\零时Word')
print('----------第3步:把30个图片分别插入30个Word内 ------------')
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,time
import docx
from docx import Document
from docx.shared import Inches,Cm,Pt
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_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 nnn in range(0,len(path)):
# word = gencache.EnsureDispatch('Word.Application')
doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\蒙德里安\蒙德里安模板.docx')# 打开带docx模板(这个模板有页脚的页码,阿夏认为页码是必须的)
table = doc.tables[0] # 一共有1个表格
# for t in : # 图案的长度为8*4=32个 遍历0-32(32个)
k=path[nnn] # 提取list图案列表里面每个图形 t=索引数字
print(k)
run=doc.tables[0].cell(0,0).paragraphs[0].add_run() # 在第一个表格中的每个单元格的第一行插入信息
run.add_picture('{}'.format(k),width=Cm(18),height=Cm(18))
# 插入,k=所在路径。单元格大小有限,每张原始尺寸8.744CM,插入的大小最多4CM
table.cell(0,0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
# doc.Save()# 把有空格的1.docx保存n
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\蒙德里安\零时Word\{}.docx'.format('%02d'%nnn))
from docx2pdf import convert
# docx 文件另存为PDF文件
inputFile = r"C:/Users/jg2yXRZ/OneDrive/桌面/蒙德里安/零时Word/{}.docx".format('%02d'%nnn) # 要转换的文件:已存在
outputFile = r"C:/Users/jg2yXRZ/OneDrive/桌面/蒙德里安/零时Word/{}.pdf".format('%02d'%nnn) # 要生成的文件:不存在
# 先创建 不存在的 文件
f1 = open(outputFile, 'w')
f1.close()
# 再转换往PDF中写入内容
convert(inputFile, outputFile)
print('----------第4步:把都有PDF合并为一个打印用PDF------------')
# 多个PDF合并(CSDN博主「红色小小螃蟹」,https://blog.csdn.net/yangcunbiao/article/details/125248205)
import os
from PyPDF2 import PdfFileMerger
target_path = 'C:/Users/jg2yXRZ/OneDrive/桌面/蒙德里安/零时Word'
pdf_lst = [f for f in os.listdir(target_path) if f.endswith('.pdf')]
pdf_lst = [os.path.join(target_path, filename) for filename in pdf_lst]
pdf_lst.sort()
file_merger = PdfFileMerger()
for pdf in pdf_lst:
print(pdf)
file_merger.append(pdf)
file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/蒙德里安/(打印合集)纯色蒙德里安({}份).pdf".format(nn))
file_merger.close()
# doc.Close()
# print('----------第5步:删除临时文件夹------------')
import shutil
shutil.rmtree('C:/Users/jg2yXRZ/OneDrive/桌面/蒙德里安/零时Word') #递归删除文件夹,即:删除非空文件夹
重点说明
1、运行参数
2、运行过程:
3、重要设置:
如何大量随机出现的长方形线条(有些参数的意思我也不太理解)
把图片导入Word
效果再展示:
感悟:
1、参考图案的随机出现: