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

背景需求:

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

【教学类-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
start=1
end=31

# 班级没有1号和7号(转学了)
numbers = [i for i in range(start, end+1) if i not in [1, 7]]
# numbers = [i for i in range(start,end+1) ]
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'\学号数感训练(学号{start}-{end}出现次数{cs}-{cs2})次.pdf'  # 替换为你的输出PDF文件路径

convert_images_to_pdf(image_folder, output_path)

import shutil

os.shutil(input_folder)

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

合并打印

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

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

相关文章

【Linux学习】深入探索进程等待与进程退出码和退出信号

文章目录 退出码return退出 进程的等待进程等待的方法 退出码 main函数的返回值&#xff1a;进程的退出码。 一般为0表示成功&#xff0c;非0表示失败。 每一个非0退出码都表示一个失败的原因&#xff1b; echo $&#xff1f;命令 作用&#xff1a;查看进程退出码。&#xf…

学AI绘图【300集SD新课】--Stable Diffusion教程

学AI绘图需要以下步骤&#xff1a; 明确目标和需求&#xff1a;首先明确设计图的目的&#xff0c;是用于展示算法流程、模型结构还是其他目的。选择合适的工具&#xff1a;根据需求选择合适的绘图工具&#xff0c;如Visio、PowerPoint、Adobe Illustrator等。绘制草图&#xf…

jmeter之HTTP请求和查看结果树

一、HTTP请求作用&#xff1a; 可以发送post或get请求等请求可以向服务器发送参数或消息体数据可以进行文件上传 HTTP请求&#xff1a;是线程组内的取样器最常用的的一个原件 二、查看界面 添加一个HTTP请求&#xff1a;选择线程组–添加–取样器–HTTP请求 默认界面 名称和…

Steam游戏被攻击怎么办,如何针对性的做好防护措施

在现代网络环境中&#xff0c;在线游戏经常成为各种网络攻击的目标&#xff0c;尤其是DDoS攻击。这类攻击不仅会导致游戏服务器瘫痪&#xff0c;还会影响玩家的游戏体验&#xff0c;损害游戏开发商的声誉和经济利益。为了应对这些威胁&#xff0c;使用专门的防护措施是必要的。…

Scrapy框架简单介绍及Scrapy项目编写详细步骤

引言 Scrapy是一个用Python编写的开源、功能强大的网络爬虫框架&#xff0c;专为网页抓取和数据提取设计。它允许开发者高效地从网站上抓取所需的数据&#xff0c;并通过一系列可扩展和可配置的组件来处理这些数据。Scrapy框架的核心组成部分包括&#xff1a; Scrapy Engine&…

rclone迁移对象存储之间的数据

1 概述 rclone是一款文件复制工具&#xff0c;既可以用于在linux主机之间复制文件&#xff0c;也可以在对象存储之间复制文件。 rclone的官网为&#xff1a; https://rclone.orgrlcone关于对象存储的官方文档为&#xff1a; https://rclone.org/s32 安装 2.1 yum安装 yum …

centos7.9用docker运行一个nginx容器

首先你的linux 系统里面已经安装好了docker&#xff0c;docker的安装教程看这个 1&#xff0c;下载nginx镜像 有很多文章会把镜像下载说成是拉取镜像&#xff0c; 我觉得就是下载的意思啊&#xff0c;搞不懂为什么要说拉取&#xff1f; docker pull nginx 下载最新版 Nginx …

深度学习之基于Unet的新冠肺炎等级分割分类系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 近年来&#xff0c;新冠肺炎&#xff08;COVID-19&#xff09;疫情给全球公共卫生安全带来了极…

操作系统基本原理

一、基本概念 二、进程管理 三、存储管理 四、文件管理 五、设备管理 六、微内核操作系统 操作系统的概念&#xff08;定义) 操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分&#xff0c;以…

光耦合器的特性和应用概述

光耦合器又称光电耦合器&#xff0c;是现代电子学中必不可少的元件&#xff0c;确保隔离电路之间安全有效的信号传输。本文探讨了光耦合器的特性及其多样化应用&#xff0c;强调了它们在各种电子系统中的关键作用。 什么是光耦合器&#xff1f; 光耦合器是一种设计用于利用光传…

第十六节:带你梳理Vue2: 生命周期与钩子函数

前沿: 通过前面几节的学习&#xff0c;我们已经对vue有了初步的了解&#xff0c;大致了解了vue可以帮我们干什么&#xff0c; 那么接下来我们就来看看vue的生命周期和它常用的钩子函数, 1. 理解生命周期的含义 生命周期&#xff1a;就是一个组件从实例化创建并添加到DOM树开…

【全开源】招聘求职小程序系统源码(ThinkPHP+原生微信小程序)

基于ThinkPHP和原生微信小程序开发的招聘平台系统&#xff0c;包含微信小程序求职者端、微信小程序企业招聘端、PC企业招聘端、PC管理平台端 构建高效人才交流平台 一、引言&#xff1a;招聘求职市场的数字化趋势 在数字化时代&#xff0c;招聘求职市场也迎来了巨大的变革。…

Edge浏览器:重新定义现代网页浏览

引言 - Edge的起源与重生 Edge浏览器&#xff0c;作为Microsoft Windows标志性的互联网窗口&#xff0c;源起于1995年的Internet Explorer。在网络发展的浪潮中&#xff0c;IE曾是无可争议的霸主&#xff0c;但随着技术革新与用户需求的演变&#xff0c;它面临的竞争日益激烈。…

Linux学习笔记:线程

Linux中的线程 什么是线程线程的使用原生线程库创建线程线程的id线程退出等待线程join分离线程取消一个线程线程的局部存储在c程序中使用线程使用c自己封装一个简易的线程库 线程互斥(多线程)导致共享数据出错的原因互斥锁关键函数pthread_mutex_t :创建一个锁pthread_mutex_in…

租赁系统|北京租赁系统|租赁软件开发流程

在数字化时代的浪潮下&#xff0c;小程序成为了各行各业争相探索的新领域。租赁行业亦不例外&#xff0c;租赁小程序的开发不仅提升了用户体验&#xff0c;更为商家带来了更多商业机会。本文将详细解析租赁小程序的开发流程&#xff0c;为有志于进军小程序领域的租赁行业从业者…

Hadoop+Spark大数据技术 实验8 Spark SQL结构化

9.2 创建DataFrame对象的方式 val dfUsers spark.read.load("/usr/local/spark/examples/src/main/resources/users.parquet") dfUsers: org.apache.spark.sql.DataFrame [name: string, favorite_color: string ... 1 more field] dfUsers.show() -----------…

【Nginx <三>⭐️⭐️⭐️】Nginx 负载均衡使用

目录 &#x1f44b;前言 &#x1f440;一、 负载均衡概述 &#x1f331;二、项目模拟 2.1 环境准备 2.2 启动多个服务器 2.3 配置 Nginx 2.4 测试配置 &#x1f49e;️三、章末 &#x1f44b;前言 小伙伴们大家好&#xff0c;前不久开始学习了 Nginx 的使用&#xff0c;在…

[图解]产品经理创新之阿布思考法

0 00:00:00,000 --> 00:00:01,900 那刚才我们讲到了 1 00:00:02,730 --> 00:00:03,746 业务序列图 2 00:00:03,746 --> 00:00:04,560 然后怎么 3 00:00:05,530 --> 00:00:06,963 画现状&#xff0c;怎么改进 4 00:00:06,963 --> 00:00:09,012 然后改进的模式…

PaddleSeg训练推理及模型转换全流程

文章目录 1、数据准备1.1 数据标注1.2 数据导出1.3 标签较验1.4 数据集整理1.5 标签可视化 2、 模型训练3、模型验证4、模型推理5、模型导出6、导出文件的推理7、将模型转换成onnx8、使用onnx进行推理 本文记录一下使用paddleseg进行语议分割模型对人体进行分割的使用流程。事实…

DTC 2024回顾丨云和恩墨重塑数据库内核技术,革新企业降本增效之道

在数字化浪潮席卷全球的当下&#xff0c;关系型数据库作为市场主导力量的地位依然稳固。然而&#xff0c;面对新兴数据库与服务形态的挑战&#xff0c;以及企业日益强烈的降本增效需求&#xff0c;数据库技术的发展必须紧跟时代步伐&#xff0c;充分发挥资源效能以提升企业竞争…