【教学类-56-03】数感训练——数字03(寻找自己的学号数字,15-20个)

news2024/11/25 0:21:54

背景需求:

在实际操作中,孩子们把数字当做了自己的学好,这个提示老师可以给每位孩子做一份“学号数感训练

【教学类-56-02】数感训练——数字02(控制指定数字出现的数量)-CSDN博客文章浏览阅读341次,点赞7次,收藏6次。【教学类-56-02】数感训练——数字02(控制指定数字出现的数量)https://blog.csdn.net/reasonsummer/article/details/139127872

用AI反复写了很久的代码,终于实现了需求。

'''
数感训练-学号1-31,指定数字至少出现10次,学号数字,左上角有灰色的答案
AI对话大师,阿夏
2024年5月22日

'''

import random
import math
from PIL import Image, ImageDraw, ImageFont
from collections import Counter
import os

# 指定数字至少出现几次15-20之间
cs = 15
cs2 = 20

# 班级没有1号和7号(转学了)
# numbers = [i for i in range(1, 31) if i not in [1, 7]]
numbers = [i for i in range(1, 32) ]
print(numbers)

path = r'C:\Users\jg2yXRZ\OneDrive\桌面\数字数感训练'

input_folder=path+r'\jpg'
os.makedirs(input_folder,exist_ok=True)

# 创建画布
canvas_width, canvas_height = 3000, 4000
canvas = Image.new('RGB', (canvas_width, canvas_height), (255, 255, 255))
draw = ImageDraw.Draw(canvas)

# 绘制黑色方框
border_color = (0, 0, 0)
border_width = 10

gray_color = (200, 200, 200)

# 定义左上角数字方框的边界坐标
x1, y1, x2, y2 = 0, 0, 700, 700
draw.rectangle([(x1, y1), (x2, y2)], outline=border_color, width=border_width)

# 定义学号数字方框的边界坐标
x1, y1, x2, y2 = 700, 0, 1000, 700
draw.rectangle([(x1, y1), (x2, y2)], outline=border_color, width=border_width)

# 定义答案方框的边界坐标
x1, y1, x2, y2 = 700, 0, 1000, 350
draw.rectangle([(x1, y1), (x2, y2)], outline=border_color, width=border_width,)

x1, y1, x2, y2 = 700, 350, 1000, 700
draw.rectangle([(x1, y1), (x2, y2)], outline=border_color, width=border_width,fill=gray_color)





n = 10
nn = []
for i in numbers:
    while True:
        numbers_written = []  # 存储成功绘制的圆圈内的数字

        # 创建白色画布
        canvas_color = (255, 255, 255)
        canvas_inner = Image.new('RGB', (canvas_width, canvas_height), canvas_color)
        draw_inner = ImageDraw.Draw(canvas_inner)

        # 将黑色方框复制到白色画布中
        canvas_inner.paste(canvas, (0, 0))

        # 在左上角绘制数字
        text_color = (0, 0, 0)
        font_path = r"C:\Windows\Fonts\simhei.ttf"  # 黑体字体路径,请根据实际情况修改
        font_size = 500
        font = ImageFont.truetype(font_path, font_size)
        if len(str(i))==1:
            draw_inner.text((230, 100), f'{i}', font=font, fill=text_color)
        else:
            draw_inner.text((90, 100), f'{i}', font=font, fill=text_color)

        

        # 生成10磅黑线白色圆圈
        circle_radius = 50
        circle_border_color = (0, 0, 0)
        circle_fill_color = (255, 255, 255)
        border_width = 5
        circle_distance = 60 + circle_radius * 2  # 圆圈之间的距离
        bj = 30  # 圆形与边框的距离

        # 存储圆圈的位置信息,用于检查是否相交
        circle_positions = []

        # 阿拉伯数字字体设置
        number_font_size = 80
        number_font = ImageFont.truetype(font_path, number_font_size)

        circle_positions = []
        numbers_written = []

        for _ in range(5000):
            # 生成圆心位置
            x = random.randint(circle_radius + border_width + bj, canvas_width - circle_radius - border_width - bj)
            y = random.randint(circle_radius + border_width + bj, canvas_height - circle_radius - border_width - bj)

            # 排除左上角区域
            if x <= 1100 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_inner.ellipse(outer_circle_bbox, outline=circle_border_color, width=border_width)

                # 绘制内圆,填充为白色
                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_inner.ellipse(inner_circle_bbox, fill=circle_fill_color)

                # 在圆圈内绘制随机生成的阿拉伯数字
                number = random.choice(numbers)
                number_width, number_height = draw_inner.textsize(str(number), font=number_font)
                number_x = x - number_width // 2
                number_y = y - number_height // 2
                draw_inner.text((number_x, number_y), str(number), font=number_font, fill=(0, 0, 0))

                # 将圆圈位置添加至列表
                circle_positions.append((x, y))

                numbers_written.append(number)

        number_counts = Counter(numbers_written)
        count_10 = number_counts[i]

        print("实际生成的圆圈数量:", len(circle_positions))
        print("生成圆圈中的数字:", numbers_written)
        print("每种数字的数量:", number_counts)
        print(f"数字 {i} 的数量:", count_10)

         # 绘制数字 count_10
         # 在左上角绘制数字
        text_color = (0, 0, 0)
        font_path = r"C:\Windows\Fonts\simhei.ttf"  # 黑体字体路径,请根据实际情况修改
        font_size = 180
        font = ImageFont.truetype(font_path, font_size)

        if len(str(count_10))==1:
            draw_inner.text((800, 430), f'{count_10}', font=font, fill=text_color)
        else:
            draw_inner.text((760, 430), f'{count_10}', font=font, fill=text_color)
        

        if count_10 >= cs and count_10 <cs2:
            # 保存为1.png
            image_path = input_folder + fr'\{i:02d}.png'
            canvas_inner.save(image_path)
            n += 1
            break
        else:
            print(f"数字 {i} 的数量小于 {cs} 次,重新生成圆圈。")

            # 删除未保存的图片
            image_path = input_folder + fr'\{i:02d}.png'
            if os.path.exists(image_path):
                os.remove(image_path)
            continue

       

        
# 合并
import os
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from PyPDF2 import PdfWriter, PdfFileMerger
from PIL import Image
import img2pdf

def convert_images_to_pdf(image_folder, output_path):
    pdf_merger = PdfFileMerger()

    for image_file in os.listdir(image_folder):
        if image_file.endswith('.jpg') or image_file.endswith('.png'):
            image_path = os.path.join(image_folder, image_file)
            pdf_path = os.path.splitext(image_path)[0] + '.pdf'

            # 使用reportlab库将图片转换为单个PDF文件
            c = canvas.Canvas(pdf_path, pagesize=letter)
            c.drawImage(image_path, 0, 0, width=letter[0], height=letter[1])
            c.save()

            # 使用img2pdf库将图片转换为单个PDF文件
            # with open(pdf_path, "wb") as pdf_file, open(image_path, "rb") as image_file:
            #     pdf_file.write(img2pdf.convert(image_file))

            # 将单个PDF文件添加到PDF合并器中
            pdf_merger.append(pdf_path)

    # 合并所有单个PDF文件为一个最终的PDF文件
    with open(output_path, 'wb') as output_file:
        pdf_merger.write(output_file)

    print(f"PDF文件已生成:{output_path}")


# 使用示例
image_folder = input_folder  # 替换为你的图片文件夹路径
output_path = path + fr'\学号数感训练(数量大于{cs}).pdf'  # 替换为你的输出PDF文件路径

convert_images_to_pdf(image_folder, output_path)

运行时间长,因为随机抽取数量,不可能马上出现15个。这一份生成了25分钟才获得。

合并打印

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TypeScript(持续更新中...)

1.TypeScript是什么&#xff1f; TypeScript是javaScript的超集。 2.使用TypeScript 1&#xff09;全局安装nodejs 2&#xff09;安装TypeScript编译器 npm i -g typescript 3.编译ts文件 //注意&#xff1a;需要在ts文件同级目录执行此命令&#xff0c;否则会报找不到…

AI爆文写作:关注热点,提前埋伏好关键词,吃系统的热点推荐,吃搜索流量,让你的文章直接爆了!

做内容&#xff0c;要对热点敏感。 小米汽车的发布会时间&#xff0c;我们是不是提前就知道&#xff0c;发布会前&#xff0c;大家最关注的就是价格。 你看这个相关关键词搜索&#xff0c;10W太多了。 我看到有博主在发布会前&#xff0c;埋伏了一篇&#xff0c;公众号也有推…

FunSound: 基于FunASR-onnx 的高精度离线转写

​ 基于funasr的高精度离线语音转写网页 www.funsound.cn 精度和速度表现不错&#xff0c;提供给大家免费测试 ​

UniApp 2.0可视化开发工具:引领前端开发新纪元

一、引言 在移动互联网迅猛发展的今天&#xff0c;移动应用开发已经成为前端开发的重要方向之一。为了简化移动应用开发流程&#xff0c;提高开发效率&#xff0c;各大开发平台不断推出新的工具和框架。UniApp作为一款跨平台的移动应用开发框架&#xff0c;自诞生以来就备受开…

如何通过软件SPI读写W25Q64

STM32F1之SPI通信软件SPI代码编写-CSDN博客 目录 1. W25Qxx系列简介 2. W25Q64硬件电路 3. W25Q64框图 4. Flash操作注意事项 5. 代码编写 5.1 初始化 5.2 W25Q64读取ID号 5.3 W25Q64写使能 5.4 W25Q64等待忙 5.5 W25Q64页编程 5.6 W25Q64扇区擦除&#x…

YOLOv5改进 | 主干网络 | 用EfficientNet卷积替换backbone【教程+代码 】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 在YOLOv5的GFLOPs计算量中&#xff0c;卷积占了其中大多数的比列&#xff0c;为了减少计算量&#xff0c;研究人员提出了用EfficientNet代替b…

PS —— 精修图像

PS —— 精修图像 修复污点修复画笔工具修复画笔工具 美白滤镜去杂锐化加杂减淡和锐化工具 我觉得今天这篇博客&#xff0c;无论是男同胞还是女同胞&#xff0c;都要熟练掌握&#xff08;哈哈哈哈…) 今天我们来学习如何精修图像&#xff0c;精修图像一般分为几步——修复&…

32 位和 64 位 Linux 上 C 语言的整数大小的分析

在 Linux 系统上进行 C 语言编程时&#xff0c;理解整数大小在 32 位和 64 位系统上的区别是开发高效、可靠程序的基础。本文将深入探讨整数在这两种架构下的大小差异及其原因&#xff0c;并介绍其对程序的影响。 整数类型及其大小 C 语言中主要的整数类型包括 char、short、i…

蓝牙模块技术在智慧养老领域的广泛运用

随着蓝牙模块通信技术的不断提升&#xff0c;蓝牙技术作为物联网无线通信技术之一&#xff0c;正在逐渐渗透到我们生活的各个领域。众所周知&#xff0c;我国人口老龄化日益严峻&#xff0c;传统的“养儿防老”已经满足不了当前的养老需求。养老不仅仅是一个家庭的问题&#xf…

【Linux网络】端口及UDP

文章目录 1.再看四层2.端口号2.1引入linux端口号和进程pid的区别端口号是如何生成的传输层有了pid还设置端口号端口号划分 2.2问题2.3netstat 3.UDP协议3.0每学一个协议 都要讨论一下问题3.1UDP协议3.2谈udp/tcp实际上是在讨论什么&#xff1f; 1.再看四层 2.端口号 端口号(Po…

安全风险 - 切换后台时背景模糊处理

因为安全风险中提到当app处于后台卡片状态时&#xff0c;显示的卡片页面应该为模糊效果&#xff0c;否则容易泄露用户隐私&#xff0c;尤其当前页涉及个人信息、资产信息等&#xff0c;都会造成信息泄露&#xff01;基于这种场景&#xff0c;我研究了下这种业务下的模糊效果 找…

[JAVASE] 类和对象(三) - 继承

目录 一. 继承的定义 1.1 基本概念 1.2 基本实现 二. 父类 和 子类中的成员访问 2.0 super 与 this 关键字 2.1 访问成员变量 2.2 访问成员方法 三. 父类 和 子类中的构造方法 3.1 访问父类中的构造方法 3.2 注意事项 四. 权限修饰限定符 public: protected: default: …

Spring系列-03-BeanFactory和Application接口和相关实现

BeanFactory BeanFactory和它的子接口们 BeanFactory 接口的所有子接口, 如下图 BeanFactory(根容器)-掌握 BeanFactory是根容器 The root interface for accessing a Spring bean container. This is the basic client view of a bean container; further interfaces such …

GD32F103RCT6/GD32F303RCT6-UCOSIII底层移植(4)消息队列实验

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 后续项目主要在下面该专栏中发布&#xff1a; 手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转&#xff1a; 手把手教你嵌入式国产化-实战项目-无刷电机驱动&am…

【LeetCode算法】第58题:最后一个单词的长度

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;双指针法。low指向单词头&#xff0c;high指向单词后的空格&#xff0c;则high-low就是每个单词的长度。算法步骤&#xff1a;①low从头往后查找第一个非空格的字符&…

分割文本文件

分割一个.txt文件&#xff0c;可以选择在命令行中使用split指令&#xff0c;或者编写一段脚本进行操作。以下是一个简单的Python脚本来分割文本文件&#xff1a; def split_file(file, lines):# Open source filewith open(file, r) as source:count 0atEOF Falsewhile not …

如果有多个文件夹,怎么快速获得文件夹的名字呢

上一篇写到怎么批量建立文件夹&#xff0c;那么怎么获取批量文件夹的名字呢&#xff1f; 一、啊这&#xff0c;这真是一个好问题二、这个得用Python&#xff08;文本末尾有打包程序&#xff0c;点击链接运行就可以了&#xff09;&#xff08;1&#xff09;首先建立一个py文件&a…

Python 将文件夹中的图片信息导入到 Excel 的表格

引言 在数据处理和管理的日常任务中&#xff0c;经常需要将文件夹中的图片文件信息&#xff08;如文件名、路径、创建日期、大小、分辨率等&#xff09;整理成一个 Excel 表格。这篇博客将介绍如何使用 Python 中的 wxPython 模块创建一个 GUI 应用&#xff0c;用户可以通过这…

jmeter保存测试计划报错——Couldn‘t save test plan to file:

jmeter保存测试计划报错——Couldnt save test plan to file:。。。。。拒绝访问 一、问题描述二、分析三、结果 一、问题描述 Couldn’t save test plan to file:D:\Program Files\apache-jmeter-5.6.2\bin\线程组.jmx D:\Program Files\apache-jmeter-5.6.2\bin\线程组.jmx(…

2024电工杯A题完整代码论文分析

2024年电工杯数学建模竞赛A题论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型…