【小白学Python】自定义图片的生成(二)

news2024/11/16 4:42:47

Python学习
【小白学Python】自定义图片的生成(一)

目录

    • 1. 文件内容
    • 2.生成图片规则
    • 3. 修改代码
      • 2.1 尝试一行汉字展示
      • 3.1 读取txt文件
      • 3.2 解决文字过长问题
      • 3.3 删减指定文字
    • 4. 总结

1. 文件内容

正如上篇文章所说,我需要读取txt文件的文字内容,将文字内容填充到图片上,按照一定规则生成多个图片。
文件大致内容如下
在这里插入图片描述

2.生成图片规则

txt是之前从zhihu问答模块尝试爬取的,可以看出来,上述文字是以问答形式呈现的,生成图片规则有两个:

  1. 每个QA的文字单独一张图片Q一行,A一行
  2. 去掉**@之后,:**之前的文字。

3. 修改代码

上一篇的完整代码如下

from PIL import Image, ImageDraw, ImageFont

# 设置图片大小
width, height = 800, 800
image = Image.new('RGB', (width, height), color='black')

# 设置文字
text = "123456"

# 加载字体文件,并设置字体大小
# 注意:确保arial.ttf字体文件路径是正确的
font = ImageFont.truetype('C:\\Windows\\Fonts\\arial.ttf', 60)
# font.color = 'yellow'
# 创建画布
draw = ImageDraw.Draw(image)

# 使用draw的textsize方法获取文本大小
text_width, text_height = draw.textsize(text, font=font)

# 计算文字位置,使其居中
x = (width - text_width) / 2
y = (height - text_height) / 2

# 绘制文字
draw.text((x, y), text, font=font, fill='white')

# 保存图片
image.save('text_image.png')

2.1 尝试一行汉字展示

替换代码如下
在这里插入图片描述
执行main.py,查看生成的图片,有问题,乱码了。
在这里插入图片描述

搜索后发现是字体使用的不兼容,更换字体为simhei.ttf,图片文字正常展示。
调整图片长宽为 width, height = 600, 900,文字位置为

x = (width - text_width) / 2
y = (height - text_height) / 3.5

执行main.py,目前看起来运作一切良好。
在这里插入图片描述

3.1 读取txt文件

为了读取指定的txt文件,我们对上述代码做了如下改动

  • 使用file.readlines()一次性读入所有txt内容,大文件需要注意,内存可能会爆
  • 根据文件内容,每4行拼接一次text,并生成一个图片
  • 将生成图片的逻辑拆分,新增drawText(text函数
from PIL import Image, ImageDraw, ImageFont

# 打开txt文件,将txt文件内容读入内存
# !!!如果文件过大,最好不要直接这么写
with open('QA.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()

text = ''

def drawText(text):
    # 设置图片大小
    width, height = 600, 900
    image = Image.new('RGB', (width, height), color='black')
    # 加载字体文件,并设置字体大小
    # 注意:确保arial.ttf字体文件路径是正确的
    font = ImageFont.truetype('C:\\Windows\\Fonts\\simhei.ttf', 20)
    # font.color = 'yellow'
    # 创建画布
    draw = ImageDraw.Draw(image)
    # 使用draw的textsize方法获取文本大小
    text_width, text_height = draw.textsize(text, font=font)
    if text_width > width + 10:
        font.size = font.size - 1
    # 计算文字位置,使其居中
    x = (width - text_width) / 2
    y = (height - text_height) / 3.5
    # 绘制文字
    draw.text((x, y), text, font=font, fill='white')
    # 保存图片
    image.save('pics/text_image_' + index.__str__() + '.png')

for index in range(len(lines)):

    #根据txt文件内容 每4行生成一张图片

    if index == 0 or index % 4 != 0:
        text = text + lines[index]
        #如果是txt结尾了,直接生成图片
        if index + 1 == len(lines):
            drawText(text)
    else:
        text = text + lines[index]
        drawText(text)
        # 将拼接的字符初始化
        text = ''

上述生成的逻辑满足了每个QA都是单独的图片,但是如果QA文字过多的话,图片中的文字会超过图片边界,无法正常展示
在这里插入图片描述

3.2 解决文字过长问题

draw.text绘制文字的函数并没有设置自动换行的功能,貌似只能根据图片的width来计算文字的长度,再尝试换行。

在这里插入图片描述
经过简单调试,采用往字符串中添加换行符\n的形式,这样图片绘制文字时可自动换行。
我这里处理的比较简单,固定的添加位置,很长的文字也只换行一次,但目前我的txt文件暂时可以用这种方式。

在这里插入图片描述

3.3 删减指定文字

由于txt文件是从zhihu爬取的,回答的时候会带上作者的名字,我想把这些文字去掉

在这里插入图片描述
在这里插入图片描述
新增如下删减函数

def remove_between_chars(s, start, end):
    while True:
        start_index = s.find(start)
        if start_index == -1:
            break
        end_index = s.find(end, start_index + len(start))
        if end_index == -1:
            break
        s = s[:start_index] + s[end_index + len(end):]
    return s

在这里插入图片描述
在这里插入图片描述

4. 总结

我的目标是将txt文件中的文字,按照一定规则绘制在图片上,当前的实现效果马马虎虎。

暂时的完整代码如下:

from PIL import Image, ImageDraw, ImageFont

# 打开txt文件,将txt文件内容读入内存
# !!!如果文件过大,最好不要直接这么写
with open('QA.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()

text = ''


def remove_between_chars(s, start, end):
    while True:
        start_index = s.find(start)
        if start_index == -1:
            break
        end_index = s.find(end, start_index + len(start))
        if end_index == -1:
            break
        s = s[:start_index] + s[end_index + len(end):]
    return s


def draw_text(text):
    text = remove_between_chars(text, '@', ':')
    # 设置图片大小
    width, height = 600, 900
    image = Image.new('RGB', (width, height), color='black')
    # 加载字体文件,并设置字体大小
    # 注意:确保arial.ttf字体文件路径是正确的
    font = ImageFont.truetype('C:\\Windows\\Fonts\\simhei.ttf', 20)
    # font.color = 'yellow'
    # 创建画布
    draw = ImageDraw.Draw(image)
    # 使用draw的textsize方法获取文本大小
    text_width, text_height = draw.textsize(text, font=font)
    # 计算文字位置,使其居中
    x = (width - text_width) / 2
    y = (height - text_height) / 3.5

    # 此处简单处理 如果将要到达边界,往字符串指定位置增加换行符
    # 这里经过调试,我这里使用22比较合适,后续需要优化
    if text_width > width - 10:
        new_text = text[:22] + "\n\n     " + text[22:]
        # 绘制文字
        x = (width - text_width // 2) / 2.5
        draw.text((x, y), new_text, font=font, fill='white')
    else:
        # 绘制文字
        draw.text((x, y), text, font=font, fill='white')
    # 保存图片
    image.save('pics/text_image_' + index.__str__() + '.png')


for index in range(len(lines)):
    # 根据txt文件内容 每4行生成一张图片
    if index == 0 or index % 4 != 0:
        text = text + lines[index]
        # 如果是txt结尾了,直接生成图片
        if index + 1 == len(lines):
            draw_text(text)
    else:
        text = text + lines[index]
        draw_text(text)
        # 将拼接的字符初始化
        text = ''

我对python掌握的比较浅显,编写代码还不太流畅,要花费不少时间用来补充基础知识,代码有很多优化是必要,上述代码的书写毫无美感可言,无论是逻辑还是简单的规范,都有很大提升的必要。

下一步的计划,除了学习python和优化代码之外,将爬取txt文件的功能和图片生成的功能结合起来,自动爬取自动生成,再长远点自动发布到指定平台

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

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

相关文章

MYSQL基础_12_MySQL数据类型精讲

第12章_MySQL数据类型精讲 1. MySQL中的数据类型 类型类型举例整数类型TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT浮点类型FLOAT、DOUBLE定点数类型DECIMAL位类型BIT日期时间类型YEAR、TIME、DATE、DATETIME、TIMESTAMP文本字符串类型CHAR、VARCHAR、TINYTEXT、TE…

Milvus Cloud 问答机器人 上线!构建企业级的 Chatbot

01. 背景 早些时候我们在社区微信群发出了一份关于Milvus Cloud 自动问答机器人的调研问卷。 调研受到了社区同学的积极响应,很快我们就收到了很多热心用户的回复。 基于这些回复,我们整理出了 Milvus Cloud Chatbot 的形态: 以功能使用和文档查询为核心 提供聊天和搜索双形…

小程序在IOS系统的兼容性

1、使用textarea标签,小程序在苹果手机中展示有bug 上面就是因为使用了textarea标签导致,换成text或者view就可以展示了 2、scroll-view横向滚动出现bug 解决办法:直接手写view加样式overflow:scroll用系统自带的滚动条

CPN Tools实现hello world小案例

新建一个net,创建两个输入P1,P2,一个输出P3,一个转换T1,并对输入输出place使用字符串颜色集。(这里是左键单击P,然后tab键输入String即可)。 为地点指定颜色集需要: 1) 通过左键单击…

以 ZGC 为例,谈一谈 JVM 是如何实现 Reference 语义的

本文基于 OpenJDK17 进行讨论 1. Reference 相关概念及其应用场景总览 Reference(引用)是 JVM 中非常核心且重要的一个概念,垃圾回收器判断一个对象存活与否都是围绕着这个 Reference 来的,JVM 将 Reference 又细分为几种具体的引…

天锐绿盾 | 无感知加密软件、透明加密系统、数据防泄漏软件

摘要:文件加密软件,包含禁止非授权的文件泄密和抄袭复制解决方案即使被复制泄密都是自动加密无法阅读,透明加密,反复制软件,内网监控,文件加密,网络安全方案,透明文件加密,加密文件,图纸加密,知识产权保护,加密数据; 通过绿盾信息安全管理软件,系统在不改…

Talk|CVPR‘24 Oral:超越3D - Point Transformer V3中的多模态特征提取新构想

本期为TechBeat人工智能社区第599期线上Talk。 北京时间6月12日(周三)20:00,香港大学博士生—吴虓杨的Talk已经准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “超越3D - Point Transformer V3中的多模态特征提取新构想”,他通过P…

Scapy使用报错Interface is invalid (no pcap match found) 解决办法

在win10环境下,想用scapy写一个通过arp协议扫描局域网的程序,主要是想看看有多少个设备在线。多次尝试未果,显示的错误信息有时为Interface is invalid,有时Interface is invalid (no pcap match found) ,为了让程序能…

Flask快速入门

Flask快速入门(路由、CBV、请求和响应、session) 目录 Flask快速入门(路由、CBV、请求和响应、session)安装创建页面Debug模式快速使用Werkzeug介绍watchdog介绍快速体验 路由系统源码分析手动配置路由动态路由-转换器 Flask的CBV…

[手游] 天命与厄动:世界

语音合成TTS: 文字转成语音的工具 WPS免登录一键修改器: 去除烦人的登录且能正常使用 《天命与厄运世界》是一款手机RPG冒险探索生存游戏,游戏中玩家将扮演四名大学生,前往一个无人荒岛进行生存探险。荒岛上随处可见可利用的资源素材,玩家需要…

CentOs7 安装mysql5.7

1.卸载原系统中的mariadb…… 首先执行命令rpm -qa|grep mariadb查看是否有mariadb的安装包,没有可以不管 接下来,执行 rpm -e --nodeps mariadb-libs #删除掉下载mysql5.7安装包 1.前往官方网站复制yum源链接Mysql官网 然后鼠标右键粘贴 wget 执行…

JUnit5学习笔记

1.JUnit5的变化 JUnit 5 JUnit Platform JUnit Jupiter JUnit Vintage JUnit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。 JUnit Jupiter: JUnit Jupiter提供了JUnit5的新的编程模…

关于Ubuntu24.04嘉立创EDA无法启动的问题

关于Ubuntu24.04嘉立创EDA无法启动的问题 查看无法启动原因解决办法1解决办法2 查看无法启动原因 在终端使用启动文件命令报错 解决办法1 输入如下命令可以正常启动 ./lceda-pro --no-sandbox 解决办法2 找到desktop文件进行修改 cd /usr/share/applications sudo vim lce…

10KM无人机高清图传通信模组,低延迟、抗干扰,飞睿智能无线MESH组网模块

随着科技的飞速发展,无人机技术在各个领域的应用越来越广泛。尤其在海上监测、搜索救援、货物运输等场景中,无人机的应用显得尤为重要。然而,要实现无人机在复杂海域环境中的高效通信,高清图传通信模组的作用不可忽视。本文将深入…

车载相机硬触发-时间同步

这里写自定义目录标题 浅谈 LVDS 之 GMSL、FPD-LINK 数据传输总线GMSL高带宽视频数据接入的方法大恒相机硬触发方法Basler 相机硬触发(line1外部触发)接线与输出Out1欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成…

全球首个光量子计算机生产线落地!量子计算机要量产了

内容来源:量子前哨(ID:Qforepost) 文丨娴睿/慕一 排版丨沛贤 深度好文:1000字丨5分钟阅 摘要:欧洲量子计算服务提供商Quandela以其创新的光量子比特生产技术,致力于推动量子计算的工业规模化…

Spring Boot集成tablesaw插件快速入门Demo

1 什么是tablesaw? Tablesaw是一款Java的数据可视化库,主要包括两部分: 数据解析库,主要用于加载数据,对数据进行操作(转化,过滤,汇总等),类比Python中的Pandas库; 数据…

tp6+swoole+mysql+nginx+redis高并发优化

1.服务器 IDC机房提供的物理机:单机 40核,64G内存,带宽100M, 2.redis 7.2配置 timeout600 #空闲连接超时时间,0表示不断开 maxclients100000 #最大连接数 3.Mysql 5.7配置,按宝塔16-32G优化方案并调整:…

springboot+shiro+jwt 兼容session和token

最近和别的软件集成项目,需要提供给别人接口来进行数据传输,发现给他token后并不能访问我的接口,拿postman试了下还真是不行。检查代码发现项目的shiro配置是通过session会话来校验信息的 ,我之前一直是前后端自己写,用…

总结了几类Midjourney制作网站风格设计的关键词和方法

第一种:根据简单的图生成你想要的设计风格Demo 我们拿MJ的一款网站风格分析 类似你只有一款产品图或者是风格框架图,JPG或者PNG透明格式都OK,来生成网站首页设计风格。 1:你先上传产品图到MJ 2:打开命令行&#xff…