背景需求:
昨天有客户订购“阿拉伯数字的数感训练”
我查看文件夹,发现前期没有生成过0-50的数字(只研究了学号数感训练的学具)
赶紧用之前写过的代码生成了一份
【教学类-56-01】数感训练——数字01(同样的数字涂色)-CSDN博客文章浏览阅读610次,点赞16次,收藏8次。【教学类-56-01】数感训练——数字01(同样的数字涂色)https://blog.csdn.net/reasonsummer/article/details/139016672?sharetype=blogdetail&sharerId=139016672&sharerefer=PC&sharesource=reasonsummer&spm=1011.2480.3001.8118【教学类-56-01】数感训练——数字01(同样的数字涂色)-CSDN博客文章浏览阅读610次,点赞16次,收藏8次。【教学类-56-01】数感训练——数字01(同样的数字涂色)https://blog.csdn.net/reasonsummer/article/details/139016672?sharetype=blogdetail&sharerId=139016672&sharerefer=PC&sharesource=reasonsummer&spm=1011.2480.3001.8118代码
'''
数感训练-0-10数字
AI对话大师,阿夏
2024年5月18日
'''
import random
import math
from PIL import Image, ImageDraw, ImageFont
import os
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\数字数感训练\jpg'
os.makedirs(path,exist_ok=True)
canvas_width, canvas_height = 3000, 4000 # 调整画布的宽度和高度
numbers = [i for i in range(0,51)]
print(numbers)
n=0
for i in numbers:
# 创建白色画布
canvas_color = (255, 255, 255)
canvas = Image.new('RGB', (canvas_width, canvas_height), canvas_color)
draw = ImageDraw.Draw(canvas)
# 字体设置
font_path = r"C:\Windows\Fonts\simhei.ttf" # 黑体字体路径,请根据实际情况修改
font_size = 500
font = ImageFont.truetype(font_path, font_size)
# 在左上角绘制阴影效果
shadow_color = (100, 100, 100)
shadow_offset = (8, 8)
draw.text((100 + shadow_offset[0], 100 + shadow_offset[1]), fr'{i}', font=font, fill=shadow_color)
# 在左上角绘制数字1
text_color = (0, 0, 0)
draw.text((100, 100), fr'{i}', font=font, fill=text_color)
# 生成10磅黑线白色圆圈
circle_radius = 100
circle_border_color = (0, 0, 0)
circle_fill_color = (255, 255, 255)
border_width = 10
circle_distance = 60 + circle_radius * 2 # 圆圈之间的距离
# 圆形于边框的距离
bj=30
# 存储圆圈的位置信息,用于检查是否相交
circle_positions = []
# 阿拉伯数字字体设置
number_font_size = 150
number_font = ImageFont.truetype(font_path, number_font_size)
# 计算可以生成圆圈的区域范围circle_distance 加了一个园的距离,离开边框就大了
# min_x = circle_radius + border_width + circle_distance
# max_x = canvas_width - circle_radius - border_width - circle_distance
# min_y = circle_radius + border_width + circle_distance
# max_y = canvas_height - circle_radius - border_width - circle_distance
min_x = circle_radius + border_width + bj
max_x = canvas_width - circle_radius - border_width - bj
min_y = circle_radius + border_width + bj
max_y = canvas_height - circle_radius - border_width - bj
for _ in range(500):
# 生成圆心位置
x = random.randint(min_x, max_x)
y = random.randint(min_y, max_y)
# 排除左上角区域
if x <= 800 and y <= 800:
continue
# 检查与已有圆圈是否相交
is_intersect = False
for position in circle_positions:
distance = math.sqrt((x - position[0]) ** 2 + (y - position[1]) ** 2)
if distance < circle_distance:
is_intersect = True
break
if not is_intersect:
# 绘制外圆,边线粗细为10磅
outer_circle_radius = circle_radius + border_width
outer_circle_bbox = (
x - outer_circle_radius, y - outer_circle_radius, x + outer_circle_radius, y + outer_circle_radius)
draw.ellipse(outer_circle_bbox, fill=circle_border_color)
# 绘制内圆,填充为白色
inner_circle_radius = circle_radius
inner_circle_bbox = (
x - inner_circle_radius, y - inner_circle_radius, x + inner_circle_radius, y + inner_circle_radius)
draw.ellipse(inner_circle_bbox, fill=circle_fill_color)
# 在圆圈内绘制随机生成的阿拉伯数字
number = random.choice(numbers)
number_width, number_height = draw.textsize(str(number), font=number_font)
number_x = x - number_width // 2
number_y = y - number_height // 2
draw.text((number_x, number_y), str(number), font=number_font, fill=text_color)
# 将圆圈位置添加至列表
circle_positions.append((x, y))
# 保存为1.png
canvas.save(path + fr'\{n:02d}.png')
n+=1
在制作PDF之前,我随机抽了几张图片,想看看每张上有几个和左上角数字相同的圆圈。
检查到第4张,就发现这张没有1个圆圈数字与左上角数字相同
有仔细看了几张,同样是这个问题
天啊,我顿时慌得一比,虽然该商品便宜(1元),但是如果找不到一个相同数字,商品本身就有质量问题。
赶紧疯狂问“星火讯飞”,测试了八次代码。
终于实现了想要的结果!!!
素材准备:
首先测试数感代码
然后是把图片制作PDF模版,我用了两个板式
A4一页1图
A4一页2图
代码展示(生成5个相同数字)
'''
数感训练-0-10数字
AI对话大师,阿夏
2024年5月18日
数感训练-0-50数字(指定左上角数字出现的数量出现5次、10次)
AI对话大师,阿夏
2024年9月26日
'''
import random
import math
from PIL import Image, ImageDraw, ImageFont
import os
# 重复的数量。数字出现10次
sz=10
import random
import math
from PIL import Image, ImageDraw, ImageFont
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\数字数感训练'
input_path=path+r'\数字'
os.makedirs(input_path,exist_ok=True)
canvas_width, canvas_height = 3000, 4000 # 调整画布的宽度和高度
numbers = [i for i in range(0,51)]
print(numbers)
n=0
for i in numbers:
# 创建白色画布
canvas_color = (255, 255, 255)
canvas = Image.new('RGB', (canvas_width, canvas_height), canvas_color)
draw = ImageDraw.Draw(canvas)
# 字体设置
font_path = r"C:\Windows\Fonts\simhei.ttf" # 黑体字体路径,请根据实际情况修改
font_size = 500
font = ImageFont.truetype(font_path, font_size)
# 在左上角绘制阴影效果
shadow_color = (100, 100, 100)
shadow_offset = (8, 8)
draw.text((100 + shadow_offset[0], 100 + shadow_offset[1]), fr'{i}', font=font, fill=shadow_color)
# 在左上角绘制数字1
text_color = (0, 0, 0)
draw.text((100, 100), fr'{i}', font=font, fill=text_color)
# 生成10磅黑线白色圆圈
circle_radius = 100
circle_border_color = (0, 0, 0)
circle_fill_color = (255, 255, 255)
border_width = 10
circle_distance = 60 + circle_radius * 2 # 圆圈之间的距离
# 圆形于边框的距离
bj=30
# 存储圆圈的位置信息,用于检查是否相交
circle_positions = []
# 阿拉伯数字字体设置
number_font_size = 150
number_font = ImageFont.truetype(font_path, number_font_size)
# 计算可以生成圆圈的区域范围circle_distance 加了一个园的距离,离开边框就大了
min_x = circle_radius + border_width + bj
max_x = canvas_width - circle_radius - border_width - bj
min_y = circle_radius + border_width + bj
max_y = canvas_height - circle_radius - border_width - bj
target_number = i
target_count = 0
for _ in range(500):
# 生成圆心位置
x = random.randint(min_x, max_x)
y = random.randint(min_y, max_y)
# 排除左上角区域
if x <= 800 and y <= 800:
continue
# 检查与已有圆圈是否相交
is_intersect = False
for position in circle_positions:
distance = math.sqrt((x - position[0]) ** 2 + (y - position[1]) ** 2)
if distance < circle_distance:
is_intersect = True
break
if not is_intersect:
# 绘制外圆,边线粗细为10磅
outer_circle_radius = circle_radius + border_width
outer_circle_bbox = (
x - outer_circle_radius, y - outer_circle_radius, x + outer_circle_radius, y + outer_circle_radius)
draw.ellipse(outer_circle_bbox, fill=circle_border_color)
# 绘制内圆,填充为白色
inner_circle_radius = circle_radius
inner_circle_bbox = (
x - inner_circle_radius, y - inner_circle_radius, x + inner_circle_radius, y + inner_circle_radius)
draw.ellipse(inner_circle_bbox, fill=circle_fill_color)
# 在圆圈内绘制随机生成的阿拉伯数字
if target_count < sz:
number = target_number
target_count += 1
else:
number = random.choice(numbers)
number_width, number_height = draw.textsize(str(number), font=number_font)
number_x = x - number_width // 2
number_y = y - number_height // 2
draw.text((number_x, number_y), str(number), font=number_font, fill=text_color)
# 将圆圈位置添加至列表
circle_positions.append((x, y))
# 保存为1.png
canvas.save(input_path + fr'\{n:02d}.png')
n+=1
# 制作wore
import os
from docx import Document
import os,time
from docx import Document
from docx.shared import Cm
from docx2pdf import convert
from PyPDF2 import PdfMerger
import shutil
from datetime import datetime
s=[[28.2,19.51],[19.5,14.13]]
mb=[1,2]
for x in range(len(mb)):
imagePath=path+r'\ls'
os.makedirs(imagePath,exist_ok=True)
file_paths = [os.path.join(input_path, file) for file in os.listdir(input_path)]
# file_paths = [os.path.join(root, file) for root, dirs, files in os.walk(tii[x]) for file in files]
pic_list_six = [file_paths[i:i+mb[x]] for i in range(0, len(file_paths), mb[x])]
print(pic_list_six)
print(len(pic_list_six))
# # print('----3、黏贴图片卡,一页1图、1页2图 一页6图-------')
# 处理每一组图片
for group_index, group in enumerate(pic_list_six):
# 创建新的Word文档
doc = Document(path + fr'\{mb[x]}图模版.docx')
# print(group)
# 遍历每个单元格,并插入图片
for cell_index, image_file in enumerate(group):
# 计算图片长宽(单位:厘米)
# 插入图片到单元格
table = doc.tables[0]
cell = table.cell(int(cell_index /mb[x]), cell_index % mb[x])
# # 如果第一行有4个格子,两个数字都写4
cell_paragraph = cell.paragraphs[0]
cell_paragraph.clear()
run = cell_paragraph.add_run()
run.add_picture(os.path.join(image_file), width=Cm(float(s[x][1])), height=Cm(float(s[x][0])))
cell_paragraph.alignment = 1 # 设置单元格中的文本居中
# 保存修改后的.docx文件
doc.save(imagePath + fr'\{group_index + 1:02d}页.docx')
# docx 文件另存为PDF文件
inputFile = imagePath + fr'\{group_index + 1:02d}页.docx' # 要转换的文件:已存在
outputFile = imagePath + fr'\{group_index + 1:02d}页.pdf' # 要生成的文件:不存在
convert(inputFile, outputFile)
time.sleep(0)
pdf_lst = [f for f in os.listdir(imagePath) if f.endswith('.pdf')]
pdf_lst = [os.path.join(imagePath, filename) for filename in pdf_lst]
pdf_lst.sort()
file_merger = PdfMerger()
for pdf in pdf_lst:
print(pdf)
file_merger.append(pdf)
# file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/描字帖/(打印合集)大班A整页描字帖2乘5加表格-4名字-({}人).pdf".format(num))
file_merger.write(path+fr"\数感训练{numbers[0]}-{numbers[-1]}重复出现{sz}次(1页{mb[x]}图).pdf")
# 9宫格制作2图任务卡时报错,
# time.sleep(0)
time.sleep(1)
# 01 06图答题卡.pdf
# 02 06图任务卡.pdf
file_merger.close()
# doc.Close()
# # print('----------第5步:删除临时文件夹------------')
import shutil
shutil.rmtree(imagePath) #递归删除文件夹,即:删除非空文件夹
第一次生成,大约30秒出完所有的图片
然后就是8分钟的合并PDF
用这个代码方法做的数感出图速度比学号数感的代码快多了!!!
随机看了两份,都是个数字
发给客户
客户希望把重复数量改成10,再生成一份
出图用了30秒,速度很快
同样随机抽了两份,都是10次
发给客户
客户说要到学校打印给孩子做,而且要A4一页大纸,感觉她也想给孩子们做“学号数感练习”。
因为客户的需求,我重新制作了简易版的数字数感训练代码,发现它的生成速度比“学号数感代码”快得多。因此可以用它来优化“学号数感代码”,提升学习制作的速度。
【教学类-56-04】数感训练——数字04(中2班寻找自己的学号数字,1号-29号,出现5-10\10-15\15-20次)-CSDN博客文章浏览阅读965次,点赞22次,收藏5次。【教学类-56-04】数感训练——数字04(中2班寻找自己的学号数字,1号-29号,出现5-10\10-15\15-20次)https://blog.csdn.net/reasonsummer/article/details/141872632