【教学类-09-09】20240406细线迷宫图05(正方形)30格+动物+箭头(15CM横版一页-1份横版)

作品展示:

560e42e97f2d4233b8a75d42270cc9f7.png

背景需求:

增加迷宫图的吸引力,起点的地方放一个小动物。

 

素材准备:

294ff62bfac7497db910df8d473ef5e2.png

1d9911941c594a189fae232632eee6eb.png

图片来自midjounery文生图(四图),但同种动物只留1个(如4个老鼠只保留一只老鼠),一共30种动物

【教学类-36-05】20230704动物头饰制作2.0(midjounery动物简笔画四图)一页两种动物-CSDN博客文章浏览阅读318次。【教学类-36-05】20230704动物头饰制作2.0(midjounery动物简笔画四图)一页两种动物https://blog.csdn.net/reasonsummer/article/details/131532632

代码展示:

'''
格子数、动物 箭头
批量制作细线条的迷宫图(15CM正方形手工纸横板一面一份横版)测试格子数量,最小3格,最多93格子,左上角数字,左下角动物,右上角箭头
作者:
1、落难Coder https://blog.csdn.net/u014297502/article/details/124839912
2、AI对话大师、
3、阿夏
作者:2024年4月5日
'''

# 15CM正方形手工纸上 以15*15格子为基础,测试0-14,16-30的格子

num=int(input('几张(最高30份,动物图只有30张)\n'))
gz=int(input('迷宫格子,(8-93,数字越大,空间越小)\n'))

print('-----------1、 生成细线迷宫-----------')
import sys
import matplotlib.pyplot as plt
from random import randint
import os

# 保存多少张图?

for i in range(num):	
	WIDTH  = gz
	HEIGHT = WIDTH 
	sys.setrecursionlimit(WIDTH * HEIGHT)

	def initVisitedList():
		visited = []
		for y in range(HEIGHT):
			line = []
			for x in range(WIDTH):
				line.append(False)
			visited.append(line)
		return visited

	def drawLine(x1, y1, x2, y2):
		plt.plot([x1, x2], [y1, y2], color="black")

	def removeLine(x1, y1, x2, y2):
		plt.plot([x1, x2], [y1, y2], color="white")

	def get_edges(x, y):
		result = []
		result.append((x, y, x, y+1))
		result.append((x+1, y, x+1, y+1))
		result.append((x, y, x+1, y))
		result.append((x, y+1, x+1, y+1))

		return result

	def drawCell(x, y):
		edges = get_edges(x, y)
		for item in edges:
			drawLine(item[0], item[1], item[2], item[3])

	def getCommonEdge(cell1_x, cell1_y, cell2_x, cell2_y):
		edges1 = get_edges(cell1_x, cell1_y)
		edges2 = set(get_edges(cell2_x, cell2_y))
		for edge in edges1:
			if edge in edges2:
				return edge
		return None

	def initEdgeList():
		edges = set()
		for x in range(WIDTH):
			for y in range(HEIGHT):
				cellEdges = get_edges(x, y)
				for edge in cellEdges:
					edges.add(edge)
		return edges

	def isValidPosition(x, y):
		if x < 0 or x >= WIDTH:
			return False
		elif y < 0 or y >= HEIGHT:
			return False
		else:
			return True

	def shuffle(dX, dY):
		for t in range(4):
			i = randint(0, 3)
			j = randint(0, 3)
			dX[i], dX[j] = dX[j], dX[i]
			dY[i], dY[j] = dY[j], dY[i]

	def DFS(X, Y, edgeList, visited):
		dX = [0,  0, -1, 1]
		dY = [-1, 1, 0,  0]
		shuffle(dX, dY)
		for i in range(len(dX)):
			nextX = X + dX[i]
			nextY = Y + dY[i]
			if isValidPosition(nextX, nextY):
				if not visited[nextY][nextX]:
					visited[nextY][nextX] = True
					commonEdge = getCommonEdge(X, Y, nextX, nextY)
					if commonEdge in edgeList:
						edgeList.remove(commonEdge)
					DFS(nextX, nextY, edgeList, visited)

	edgeList = initEdgeList()
	visited  = initVisitedList()
	DFS(0, 0, edgeList, visited)
	edgeList.remove((0, 0, 0, 1))
	edgeList.remove((WIDTH, HEIGHT-1, WIDTH, HEIGHT))

	figure = plt.figure(figsize=(15,15))  # 创建一个指定大小的图像窗口
	ax = plt.Axes(figure, [0., 0., 1., 1.], frame_on=False)  # 创建一个坐标轴,覆盖整个图像窗口
	figure.add_axes(ax)
	ax.axis('off')  # 关闭坐标轴显示

	for edge in edgeList:
		drawLine(edge[0], edge[1], edge[2], edge[3])

	# 新建图片文件夹,保存所有生成的迷宫图
	path=r'C:\Users\jg2yXRZ\OneDrive\桌面\细线迷宫图图片'
	folder_path = path+r'\01迷宫图'
	os.makedirs(folder_path, exist_ok=True)


	plt.savefig(folder_path+r'\{}.png'.format('%02d'%i), dpi=400)  # 保存迷宫图像为maze.png,设置dpi参数调整图像质量

	plt.close()  # 超过20张图片会提示占内存,所以关闭图像窗口释放内存
	# plt.show()


# print('-----------2、PNG上左上角加格子数目----------')

import os
from PIL import Image, ImageDraw, ImageFont

path=r'C:\Users\jg2yXRZ\OneDrive\桌面\细线迷宫图图片'
folder_path = path+r'\01迷宫图'
# 获取文件夹内的所有文件
# folder_path = "path/to/123"
files = os.listdir(folder_path)


for file in files:
    if file.endswith(".png"):
        # 构建图片的完整路径
        image_path = os.path.join(folder_path, file)

        # 打开图片
        image = Image.open(image_path)

        # 创建一个可以在图片上绘制的对象
        draw = ImageDraw.Draw(image)

        # 定义字体和字号
        font = ImageFont.truetype("C:\Windows\Fonts\Arial.ttf", 200)

        # 在图片左上角写入文件名 
		# 300, 300正好在左上角的格子内部
		# 50, 50正好在左上角的格子外部
        draw.text((50, 50), f'{gz}', fill="black", font=font)

        # 保存修改后的图片
        image.save(image_path)

        # 关闭图片
        image.close()

print('-----------3、PNG上加两个箭头,左下角 右上角的坐标点----------')


from PIL import Image
import os


path=r'C:\Users\jg2yXRZ\OneDrive\桌面\细线迷宫图图片'
folder_path = path+r'\01迷宫图'
# 箭头图片路径
arrow_image_path = path + r'\00箭头.png'
# arrow_image_path = path + r'\01房屋.png'


# 调整后的箭头图片大小
new_arrow_size = (200, 150)  # 箭头图片大小


# 箭头坐标
p1=[5750]
p2=[280]



for r in range(len(p1)):
	#  遍历图片文件夹
	for filename in os.listdir(folder_path):
		if filename.endswith('.png'):
			# 打开原始图片
			image_path = os.path.join(folder_path, filename)
			image = Image.open(image_path)

			# 打开箭头图片并调整大小
			arrow_image = Image.open(arrow_image_path)
			arrow_image = arrow_image.resize(new_arrow_size)			

			# 如果箭头图片模式不是RGBA,则转换为RGBA模式以保留透明度信息
			if arrow_image.mode != 'RGBA':
				arrow_image = arrow_image.convert('RGBA')

			# 在指定位置添加箭头图片
			position = (int(p1[r]), int(p2[r]))  # 替换为你想要添加箭头图片的位置坐标
			image.paste(arrow_image, position, mask=arrow_image)

			# 保存修改后的图片
			new_image_path = os.path.join(folder_path, filename)
			image.save(new_image_path)

			# 关闭图片对象
			image.close()
			arrow_image.close()
 
print('-----------2、PNG 起点加上动物图片----------')


from PIL import Image
import os

path=r'C:\Users\jg2yXRZ\OneDrive\桌面\细线迷宫图图片'
folder_path = path+r'\01迷宫图'
pic_path = path+r'\04动物四格图片'

# 使用列表推导式获取所有PNG文件的路径和文件名,并存储在列表中
folder_files = [os.path.join(dp, f) for dp, dn, fn in os.walk(folder_path) for f in fn if f.endswith('.png')]
animal_files = [os.path.join(dp, f) for dp, dn, fn in os.walk(pic_path) for f in fn if f.endswith('.png')]


# 调整后的箭头图片大小
new_animal_size = (300, 200)  # 替换为你想要的箭头图片尺寸
# # 调整后的动物图片大小
# new_animal_size = (400, 400)  # 替换为你想要的箭头图片尺寸

# #1张横版的左下箭头 (300,7730)   4张横版的右上箭头 (11150, 450)
p1=[50]
p2=[5550]

# 遍历坐标
for r in range(len(p1)):
# 	#  遍历图片文件夹
	for o in range(len(folder_files)):
		image_path =folder_files[o]
		print(image_path)
# # 	C:\Users\jg2yXRZ\OneDrive\桌面\细线迷宫图图片\01迷宫图\00.png
# 		# C:\Users\jg2yXRZ\OneDrive\桌面\细线迷宫图图片\01迷宫图\01.png
		image = Image.open(image_path)

		# # 打开箭头图片并调整大小
		arrow_image = Image.open(animal_files[o])
		arrow_image = arrow_image.resize(new_animal_size)			

		# 如果箭头图片模式不是RGBA,则转换为RGBA模式以保留透明度信息
		if arrow_image.mode != 'RGBA':
			arrow_image = arrow_image.convert('RGBA')

		# 在指定位置添加箭头图片
		position = (int(p1[r]), int(p2[r]))  # 替换为你想要添加箭头图片的位置坐标
		image.paste(arrow_image, position, mask=arrow_image)

		# 保存修改后的图片 原图替换保存
		# new_image_path = os.path.join(folder_path, filename)
		image.save(image_path)

		# 关闭图片对象
		image.close()
		arrow_image.close()

print('-----------3、 导入word,合并png----------')

import os,time
from docx import Document
from docx.shared import Cm, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docx2pdf import convert
from PyPDF2 import PdfMerger

# 设置路径和文件夹名称

# folder_path ='迷宫图所有图片文件夹路径'
path=r'C:\Users\jg2yXRZ\OneDrive\桌面\细线迷宫图图片'
folder_path = path+r'\01迷宫图'
template_path = path+r"\04迷宫图细线(15CM1张横图).docx"# 模板文件路径
output_path =path+r'\零时Word'# 生成docx和PDF的文件夹,最后要删除

# 创建输出文件夹
if not os.path.exists(output_path):
    os.makedirs(output_path)

n = 1
# 遍历图片文件夹
for filename in os.listdir(folder_path):
    if filename.endswith('.png'):
        # 打开模板文档
        doc = Document(template_path)
        
        # 获取第一个表格
        table = doc.tables[0]
        
        # 在表格中插入图片
        table.cell(0, 0).paragraphs[0].add_run().add_picture(os.path.join(folder_path, filename), width=Cm(15), height=Cm(14.94))
        
        # 保存为Word文档
        doc.save(os.path.join(output_path, '{:02d}.docx'.format(n)))
        time.sleep(3)
        # 转换为PDF
        convert(os.path.join(output_path, '{:02d}.docx'.format(n)), os.path.join(output_path, '{:02d}.pdf'.format(n)))
        n += 1
	
# 合并PDF
pdf_lst = [os.path.join(output_path, filename) for filename in os.listdir(output_path) if filename.endswith('.pdf')]
pdf_lst.sort()

file_merger = PdfMerger()
for pdf in pdf_lst:
    file_merger.append(pdf)

file_merger.write(path+fr'\01(打印合集)迷宫图(动物+箭头)({gz}格测试)(15CM整页1份横图)({num}份).pdf')

time.sleep(5)

# file_merger.write(os.path.join(output_path, '合并后的PDF.pdf'))
file_merger.close()

# 删除临时文件夹
import shutil
shutil.rmtree(output_path)
shutil.rmtree(folder_path)


74ac506723c842d8ba050816a445167a.png529ae1e834684cf08cd2162886ced02b.png152a8a1a12de4907bd776a6faf6b433d.png左下角动物增加迷宫趣味性

 

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

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

相关文章

YOLOv8 UI界面设计+热力图显示

进入可视化设计界面&#xff0c;设计UI pyside6-designer 设计好UI保存&#xff0c;然后通过以下命令将ui文件保存为py pyside6-uic myui.ui > myui.py 通过以下命令将资源文件qrc保存为py pyside6-rcc my_rc.qrc > my_rc.py 写主窗口函数实现功能... 项目基于yol…

React - 连连看小游戏

简介 小时候经常玩连连看小游戏。在游戏中&#xff0c;当找到2个相同的元素就可以消除元素。 本文会借助react实现连连看小游戏。 实现效果 实现难点 1.item 生成 1. 每一个图片都是一个item&#xff0c;items数组的大小为size*size。 item对象包括grid布局的位置&#xff0c;…

哈佛大学商业评论 -- 第二篇:增强现实是如何工作的?

AR将全面融入公司发展战略&#xff01; AR将成为人类和机器之间的新接口&#xff01; AR将成为人类的关键技术之一&#xff01; 请将此文转发给您的老板&#xff01; --- 本文作者&#xff1a;Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的&#xff0c;但大…

【ORB-SLAM3】Ubuntu20.04 使用 RealSense D435i 运行 ORB-SLAM3 时遇到的一些 Bug

【ORB-SLAM3】使用 RealSense D435i 跑 ORB-SLAM3 时遇到的一些 Bug 1 hwmon command 0x80( 5 0 0 0 ) failed (response -7 HW not ready)2 No rule to make target /opt/ros/noetic/lib/x86_64-linux-gnu/librealsense2.so, needed by ../lib/libORB_SLAM3.so 1 hwmon comman…

Tomcat调优总结

Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置。首先是对这几个参数的含义要有深刻而清楚的理解。以tomcat8.5为例&#xff0c;讲解参数。 同时也得认识到一点&#xff0c;tomcat调优也受制于linux内核。linux内核对tcp连接也有几个参数可以调优。 因此可以将…

intellij idea 使用git ,快速合并冲突

可以选择左边的远程分支上的代码&#xff0c;也可以选择右边的代码&#xff0c;而中间是合并的结果。 一个快速合并冲突的小技巧&#xff1a; 如果冲突比较多&#xff0c;想要快速合并冲突。也可以直接点击上图中 Apply non-conflicting changes 旁边的 All 。 这样 Idea 就会…

构建未来交通:香橙派OPI Airpro上的智能交通监管系统

引言&#xff1a; 随着城市化进程的加速&#xff0c;交通管理变得越来越复杂。 传统的交通监管系统往往无法有效应对日益增长的车辆数量和复杂的交通状况。因此&#xff0c;我们需要一种更加智能和自适应的解决方案来提高交通效率并减少事故发生率。 香橙派OPI Airpro以其强大的…

什么是redis缓存的雪崩、穿透以及击穿

缓存雪崩 举个例子&#xff0c;例如在双十一中&#xff0c;一点进去。访问量大&#xff0c;所以它很多数据是放在redis区缓存起来&#xff0c;对应redis的100个key。然后假设设置缓存失效时间是三小时。当双十一期间&#xff0c;购物超过这个三小时之后。这个首页的redis缓存会…

LeetCode十一题:容纳最多水的容器【11/1000 python】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 LeetCode解锁1000题: 打怪升级之旅htt…

信息系统项目管理师——第18章项目绩效域管理(一)

本章节内容属于第四版新增知识&#xff0c;为PMBOK第七版专有&#xff0c;选择、案例、论文都会考&#xff0c;属于比较重要的章节。 选择题&#xff0c;稳定考3分左右&#xff0c;新教材基本考课本原话&#xff0c;需要多读课本&#xff0c;多刷题。 案例题&#xff0c;考的概…

SpringBoot快速入门笔记(3)

文章目录 一、MybatisPlus1、ORM2、添加依赖3、全局配置4、Navicat5、UserController6、CRUD操作7、BaseMapper8、两个注解 二、多表查询1、模拟用户订单2、通过用户查相关订单3、UserMapperNew4、查询订单和所属用户5、OrderMapper6、OrderController 三、条件查询四、分页查询…

C++之类

目录 一&#xff1a;面向过程和面向对象的初步认识 二&#xff1a;类的引入 三&#xff1a;类的定义 3.1类的两种定义方式&#xff1a; 3.2成员变量命名的建议 四&#xff1a;类的访问限定符及封装 4.1类的访问限定符 4.2封装 一&#xff1a;面向过程和面向对象的初步认…

【学习笔记】java项目—苍穹外卖day09

文章目录 用户端历史订单模块1. 查询历史订单1.1 需求分析和设计1.2 代码实现1.2.1 user/OrderController1.2.2 OrderService1.2.3 OrderServiceImpl1.2.4 OrderMapper1.2.5 OrderMapper.xml1.2.6 OrderDetailMapper 1.3 功能测试 2. 查询订单详情2.1 需求分析和设计2.2 代码实…

【计算机考研】408到底有多难?值得冲吗?

考408就必须要面对的现实&#xff01;拒绝眼高手低&#xff01;&#xff01; 408其实想达到110并不难&#xff0c;但是想上130是比较困难的。 几个必须要面对的现实&#xff1a; 1.如果备考的是11408&#xff0c;除非基础特别好或者学习能力特别强&#xff0c;否则一定要尽早…

[Python] 如何导出PDF文件中的图片

文章目录 一、背景说明二、代码编写三、问题3.1、如何得到图片的xref&#xff1f;3.2、xref有什么用呢&#xff1f; 四、总结 一、背景说明 最近在看一份pdf的书籍&#xff0c;其中有一些图片绘制地比较出色&#xff0c;所以就打算将其复制出来&#xff0c;以便于在需要的时候…

TCP客户端及服务器端开发实践

一、TCP客户端及服务器端开发实践 1、TCP网络应用程序开发分类 ① TCP客户端应用程序开发 ② TCP服务器端应用程序开发 客户端程序是指运行在用户设备上的程序&#xff0c;服务端程序是指运行在服务器设备上的程序&#xff0c;专门为客户端提供数据服务。那如何记忆呢&…

深入浅出 -- 系统架构之单体架构

单体架构&#xff08;Monolithic Architecture&#xff09; 单体架构的定义 单体架构&#xff08;Monolithic Architecture&#xff09;是一种传统的软件架构模式&#xff0c;将整个应用程序作为一个单一的、统一的单元进行开发、部署和扩展。在单体架构中&#xff0c;所有的功…

【数字图像处理matlab系列】空间域处理之亮度变换(imadjust函数使用)

【数字图像处理matlab系列】空间域处理之亮度变换(imadjust函数使用) 在空间域中&#xff0c;图像处理就是直接对图像的像素进行操作 imadjust 是 MATLAB 中用于调整图像强度值或颜色图的函数。它可以改变图像的对比度&#xff0c;使得图像更清晰或更易于分析。以下是 imadju…

计算机网络针对交换机的配置

实验 目的 交换机的基本配置&#xff0c;交换机VLAN配置 实验条件 Windows&#xff0c;Cisco packet tracer 实验 内容 交换机的基本配置&#xff0c;交换机VLAN配置 实验 过程 一、交换机的基本配置 进入特权模式 Switch>enable 进入配置模式 Switch#configure ter…

第15届蓝桥杯省赛模拟第二期题解及代码实现

试题A:求余数 问题描述 求12345678901234567890123456789012345678901234567890除以2023的余数。 答案提交 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一个整数&#xff0c;在提交答案时只填写这个整数&#xff0c;填写多余…