【教师节特辑】做个教师节快乐照片墙吧

news2025/1/16 1:56:12

写作原因:

        教师节到了,身边或多或少都有很多不少的老师,基本以前认识的老师都不记得了,以后总也会认识一些日本老师的。程序员,就应该以自己的方式来庆祝教师节。想了下,要不还是做个照片墙把。

项目链接 airhandsome/wall-of-text: Use picture to compose text (github.com)

写代码:

       这种代码肯定是用万能的python来处理,虽然以前使用的CV基本忘光了,不过python的好处就在于我们随时随地都能找到一些好用的库。既然是照片墙,具体肯定要分三个方面:

1. 取照片

这边用大家都很熟悉的合法工具request拿一些公开的图片,应该不算违规把。

这边那我选取了百度贴吧的一个教师节快乐帖子,里面有二十几张图片,挺喜庆的,这时候只要解析到BDE_Image标签就能用了

def getJPGs(url):
    # 获取url链接的内容
    html = requests.get(url)
    soup = BeautifulSoup(html, "html.parser")
    # 查找 class 为 BDE_Image 的图片标签
    image_tags = soup.find_all("img", class_="BDE_Image")
    # 提取图片链接
    image_urls = [img["src"] for img in image_tags]
    return image_urls


#保存单张图片
def downloadJPG(imgUrl, fileName):
    response = requests.get(imgUrl)
    with open(fileName, 'wb') as f:
        f.write(response.content)

#保存图片列表
def batchDownloadJPGs(imgUrls, path='pixels/'):
    if not os.path.exists(path):
        os.mkdir(path)

    count = 0
    for url in imgUrls:
        downloadJPG(url, ''.join([path, '{0}.jpg'.format(count)]))
        print('number: ' + str(count))
        count = count + 1

if __name__ == "__main__":
    url = 'https://tieba.baidu.com/p/8594160102'
    jpgs = getJPGs(url)
    batchDownloadJPGs(jpgs)

2. 拿底料

什么是底料呢,就是这个照片墙要组成什么形状啊,比如我现在就是想组成文字,那就组呗,得整个Python库用一下

def get_text_position(text):
    pygame.init()
    font_size = 30  # 字体大小pygame.init()  # 模块的初始化  为什么  pygame不是我开发的, 我们用的别人  python语法  三原色
    font = pygame.font.Font('msyh.ttc', font_size)
    print(font)  # 字体的渲染
    # True 锯齿化   rgb 颜色 由三原色组成  黑  白
    font_text = font.render(text, True, (0, 0, 0), (255, 255, 255))
    print(font_text)  # 获取字体的宽高
    height = font_text.get_height()  # 高度
    width = font_text.get_width()  # 宽度
    print('height: ', height)
    print('width: ', width)  # 根据什么逻辑贴图  像素点
    image_row_list = []
    #缩放程度,1就是原图大小,2就是缩小为原来的一半
    shrink_part = 1
    for x in range(height // shrink_part):
        image_col_list = []
        for y in range(width // shrink_part):
            val = 0
            for i in range(shrink_part):
                for j in range(shrink_part):
                    x_index = x * shrink_part + i
                    y_index = y * shrink_part + j
                    val += font_text.get_at((y_index, x_index))[0]
            val //= shrink_part * shrink_part
            if val != 255:  # 如果像素点不是白色
                image_col_list.append(1)  # 黑色添加数据1
            else:
                image_col_list.append(0)  # 白色添加数据0
        image_row_list.append(image_col_list)

    return list(image_row_list)

这边的text就是填写你要的内容,比如说我要生成“教师节快乐”,参数就是“教师节快乐”

3. 画图

把第二步的结果直接传进来就能画了,实际上就是第二部的矩阵中为1的就随机放一张图片上去。最后保存好。

def drawImage(image_list):
    width_len = len(image_list[0])  # 列表的宽
    height_len = len(image_list)  # # 列表的高# 创建图片
    new_image = Image.new('RGB', (width_len * 100, height_len * 100), (255, 255, 255))  # 贴图
    img_size = 100  # 初始图片尺寸
    for row in range(height_len):
        for clo in range(width_len):
            if image_list[row][clo] == 1:  # 如过列表的值为1, 就贴图# 读取图片
                source_image = Image.open('pixels/' + random.choice(os.listdir(r'pixels')))# 修改图片的大小
                source_image = source_image.resize((img_size, img_size), Image.LANCZOS)# 将图片复制到new_image
                new_image.paste(source_image, (clo * img_size, row * img_size))# 照片强保存
    print('正在生成照片墙...')
    new_image.save('output.png')
    print('保存完毕, 请在当前文件项目下查找')

效果

无缩放的图片,大概14M吧

wall-of-text/output_1.png at main · airhandsome/wall-of-text (github.com)icon-default.png?t=N7T8https://github.com/airhandsome/wall-of-text/blob/main/output_1.png

设置了shrink_part = 2的图片,大概 6M,其实就是每2*2的像素合并成为1个像素,所以看起来会比较粗糙,但是因为微信发送的话会压缩,就没有效果了,所以粗糙点可能好点。

wall-of-text/output.png at main · airhandsome/wall-of-text (github.com)icon-default.png?t=N7T8https://github.com/airhandsome/wall-of-text/blob/main/output.png

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

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

相关文章

2024年java面试--mysql(2)

系列文章目录 2024年java面试(一)–spring篇2024年java面试(二)–spring篇2024年java面试(三)–spring篇2024年java面试(四)–spring篇2024年java面试–集合篇2024年java面试–redi…

电商API与电商数据经济的产生【电商平台-淘宝/京东/拼多多下的API数据经济】

计算机连接了互联网后,释放出了巨大的创新力和价值,同样地,智能合约一旦连接到快速增长的链下数据和API经济,也将变得无比强大。如果智能合约可以连接至链下数据提供商、web API、企业系统、云服务商、物联网设备、支付系统以及其…

高分三号1米分辨率飞机检测识别数据集

二、背景介绍 合成孔径雷达(Synthetic Aperture Radar, SAR) 是一种主动式的微波成像系统,它不受光照、云雾 和气候等自然条件影响,具备全天时、全天候对地 观测的能力,已成为遥感领域重要的信息获取平 台。近年来,随着遥感成像技…

Redis主从复制集群的介绍及搭建

在现代的软件开发中,数据的可靠性和可用性是至关重要的。Redis,作为一个开源的、内存中的数据结构存储系统,以其出色的性能和灵活的数据结构,赢得了开发者们的广泛喜爱。而 Redis 的主从复制功能,更是为我们提供了一种…

基于AHP模型指标权重分析python整理

一 背景介绍 日常会有很多定量分析的场景,然而也会有一些定性分析的场景针对定性分析的场景,预测者只能通过主观判断分析能力来推断事物的性质和发展趋势然而针对个人的直觉和虽然能够有一定的协助判断效果,但是很难量化到指标做后期的复用 …

Mybatis学习笔记2 增删改查及核心配置文件详解

Mybatis学习笔记1 Mybatis入门_biubiubiu0706的博客-CSDN博客 将Mybatis进行封装 SqlSessionUtil工具类 package com.example.util;import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFacto…

modinfo对比内核版本号

加载内核&#xff0c;出现版本不一样 cat /proc/verison查看内核板本 模块版本&#xff1a;显示模块的版本号。 $ modinfo [OPTIONS] [MODULE] 参数说明-F, --field <field>: 指定要显示的字段&#xff0c;可以使用逗号分隔多个字段。-k, --kernel <kernel>: 指定…

第15章_瑞萨MCU零基础入门系列教程之Common I2C总线模块

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

香橙派使用外设驱动库wiringOP来驱动蜂鸣器

硬件接线 回顾香橙派的物理引脚对应&#xff1a; 所以将VCC接到1&#xff0c;GND接到6&#xff0c;I/O口接到7&#xff1a; 代码编写 香橙派的wiringOP库提供了很多的例程&#xff0c;可以将blink.c拷贝进自己的代码文件夹来修改&#xff1a; 小插曲---将手动对齐的Tab和自动对…

《向量数据库指南》——向量数据库和关系型数据库的区别?

向量数据库和关系型数据库是两种不同类型的数据库系统,它们在数据模型、数据存储、查询操作等方面存在许多区别。以下是向量数据库和关系型数据库的主要区别: 1、数据模型: 向量数据库:向量数据库专门设计用于存储和查询向量数据,这些数据通常表示为数值向量或嵌入向量。向…

精品基于NET实现的教育资源配置管理系统

《[含文档PPT源码等]精品基于NET实现的教育资源配置管理系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发软件&#xff1a;VS 2017 &#xff08;版本2017以上即可&#xff0c;不能低于2017&#xff09…

50个渗透(黑客)常用名词及解释

目录 前言 一.渗透测试 二.网络安全 三.安全攻击 四.黑客工具 五.渗透方法 六.网络钓鱼 七.攻击技术 八.其他名词 总结 前言 网络安全是当今互联网时代不可忽视的重要议题。随着科技的发展&#xff0c;黑客渗透技术也日益复杂和潜在危险。为了加强对网络安全的认识&…

【无标题】C/C++内存管理

目录 一. C/C内存分布 二. C语言中动态内存管理方式 1.malloc/calloc/realloc和free 三. C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 四.malloc/free和new/delete的区别 五.内存泄漏 1.什么是内存泄漏&#xff0c;内存泄漏的危害 一. C…

makefile之伪目标PHONEY

当前目录有同makefile中同名的文件,make目标是不会执行的 clean:的依赖是空的,执行的规则条件没有满足. 伪目标是为了解决这个问题,在clean前面增加.PHONEY:clean include Makefile.config SRC : $(wildcard *.c wildcard audio_module/*.c) SRC_OBJ $(patsubst %.c,%.o,$(S…

SpringCloud简介 + Eureka注册发现中心

目录 1.SpringCloud简介 2. Eureka注册发现中心 2.1 Eureka简介 2.2 Eureka的处理机制 2.2.1 Register——服务注册 2.2.2 Renew——服务续约 2.2.3 Eviction——服务剔除 2.2.4 Cancle——服务下线 2.3 Eureka的配置文件 2.4 创建第一个Eureka项目 2.5 Eureka服务注…

C语言指针详解(2)------指针用法(概念+举例)非常详细易理解

C语言指针用法详解及举例 在学习用法之前&#xff0c;大家可以看看我上一节对指针的分类哦&#xff0c;这里我们在复习一下指针的概念&#xff1a; 1.指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 2.指针的大小是固定的4/8个字节&#xff08…

Pytorch入门(6)—— 梯度计算控制

前文 PyTorch入门&#xff08;2&#xff09;—— 自动求梯度 介绍过 Pytorch 中的自动微分机制&#xff0c;这是实现神经网络反向传播的基础&#xff0c;也是所有深度学习框架最重要的基础设施之一梯度计算是需要占用计算资源的&#xff0c;而我们并不总是需要计算梯度&#xf…

锯片检测示例

1.锯片检测 1.1 应用示例目的与思路 (1) 提取并筛选锯齿的轮廓&#xff1b; (2) 对筛选后的锯齿轮廓进行直线拟合&#xff1b; (3) 统计正常锯齿的角度和缺陷锯齿的个数。 1.2 应用示例相关算子介绍 (1) threshold_sub_pix(Image : Border : Threshold : ) 功能&#xf…

应用开发平台集成工作流系列之10——流程建模功能环节业务逻辑处理的设计与实现

背景 基于工作流的表单流转&#xff0c;在某些特定的环节&#xff0c;需要执行一些业务逻辑处理。例如动态分配节点处理人、发送邮件或短信给待办用户、统计流程处理时长判断是否超时&#xff0c;以及业务层面数据处理&#xff08;例如&#xff0c;在请假流程中将部门领导审批…

Unity之Android项目的打包

一 Unity里面配置Android运行环境 1.1 首先unity需要集成android编译环境&#xff0c;点击FIle->Build Settings 1.2 没是否有Android模块&#xff0c;没的话先下载Android模块 1.3 按下面的操作&#xff0c;下载Android支持&#xff0c;SDK&#xff0c;NDK&#xff0c;和J…