from PIL import Image,文字成图,ImageFont import jieba分词,input优雅python绘制图片

news2025/1/13 3:07:19

开始的代码

import os
from PIL import Image, ImageDraw, ImageFont
import jieba

def generate_image_with_white_bg(text, font_path, output_path):
    # 设置图片大小和背景颜色
    image_width = 800
    image_height = 600
    bg_color = (255, 255, 255)  # 白色

    # 创建图片对象
    image = Image.new("RGB", (image_width, image_height), bg_color)
    draw = ImageDraw.Draw(image)

    # 设置字体和字体大小
    font_size = 36
    font = ImageFont.truetype(font_path, font_size)

    # 将文本按行分割
    lines = text.split("\n")

    # 绘制文本
    y = 50  # 初始纵坐标
    for line in lines:
        words = jieba.lcut(line)  # 分词去重
        for word in words:
            word = word.replace(",", " ").replace("。", " ").replace("?", " ")  # 替换标点符号为空格
            draw.text((50, y), word, fill=(0, 0, 0), font=font)  # 绘制文本
            y += 50  # 纵坐标递增

    # 保存图片
    image.save(output_path)

def generate_image_with_black_bg(text, font_path, output_path):
    # 设置图片大小和背景颜色
    image_width = 800
    image_height = 600
    bg_color = (0, 0, 0)  # 黑色

    # 创建图片对象
    image = Image.new("RGB", (image_width, image_height), bg_color)
    draw = ImageDraw.Draw(image)

    # 设置字体和字体大小
    font_size = 36
    font = ImageFont.truetype(font_path, font_size)

    # 将文本按行分割
    lines = text.split("\n")

    # 绘制文本
    y = 50  # 初始纵坐标
    for line in lines:
        words = jieba.lcut(line)  # 分词去重
        for word in words:
            word = word.replace(",", " ").replace("。", " ").replace("?", " ")  # 替换标点符号为空格
            draw.text((50, y), word, fill=(255, 255, 255), font=font)  # 绘制文本
            y += 50  # 纵坐标递增

    # 保存图片
    image.save(output_path)

def main():
    # 输入文本内容
    print("请输入多行文本内容,以空行结束:")
    text = ""
    while True:
        line = input()
        if line == "":
            break
        text += line + "\n"

    # 创建保存路径
    save_path = "/storage/emulated/0/文件/aidliux/生成图片/"
    os.makedirs(save_path, exist_ok=True)

    # 生成白底黑字宋体图片
    default_font_path = "path_to_default_font.ttf"  # 将此处替换为安卓默认字体文件路径
    white_bg_output_path = os.path.join(save_path, "white_bg_simsun.jpg")
    generate_image_with_white_bg(text, default_font_path, white_bg_output_path)

    # 生成黑底白字宋体图片
    black_bg_output_path = os.path.join(save_path, "black_bg_simsun.jpg")
    generate_image_with_black_bg(text, default_font_path, black_bg_output_path)

    print("白底黑字宋体图片已生成,保存路径为:{}".format(white_bg_output_path))
    print("黑底白字宋体图片已生成,保存路径为:{}".format(black_bg_output_path))

if __name__ == "__main__":
    main()

运行的结果

/data/user/0/org.qpython.qpy/files/bin/qpy thon3.sh "/storage/emulated/0/qpython/表格 操作行列1.2.5.6.5.文字成图.py" && exit
作行列1.2.5.6.5.文字成图.py" && exit     < 请输入多行文本内容,以空行结束:
优雅之美

Traceback (most recent call last):
  File "/storage/emulated/0/qpython/表格操 作行列1.2.5.6.5.文字成图.py", line 90, in  <module>
    main()
  File "/storage/emulated/0/qpython/表格操 作行列1.2.5.6.5.文字成图.py", line 80, in  main
    generate_image_with_white_bg(text, def ault_font_path, white_bg_output_path)
  File "/storage/emulated/0/qpython/表格操 作行列1.2.5.6.5.文字成图.py", line 17, in  generate_image_with_white_bg
    font = ImageFont.truetype(font_path, f ont_size)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^
  File "/data/user/0/org.qpython.qpy/files /lib/python3.11/site-packages/PIL/ImageFon t.py", line 976, in truetype
    return freetype(font)
           ^^^^^^^^^^^^^^
  File "/data/user/0/org.qpython.qpy/files /lib/python3.11/site-packages/PIL/ImageFon t.py", line 973, in freetype
    return FreeTypeFont(font, size, index,  encoding, layout_engine)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/user/0/org.qpython.qpy/files /lib/python3.11/site-packages/PIL/ImageFon t.py", line 249, in __init__
    self.font = core.getfont(
                ^^^^^^^^^^^^^
OSError: cannot open resource
1|:/ $
1|:/ $

错误❌print

这个错误是由于缺少字体文件导致的。在代码中,你需要替换default_font_path变量为安卓设备上的默认字体文件路径。

你可以按照以下步骤来解决这个问题:

1. 在安卓设备上找到默认字体文件路径。通常情况下,它们位于/system/fonts/目录下,文件名可能是DroidSans.ttfNotoSansCJK-Regular.ttc等。你可以使用文件管理器或者终端来查找。

2. 将找到的默认字体文件路径替换到代码中的default_font_path变量。例如,假设找到的路径是/system/fonts/DroidSans.ttf,则代码中应该替换为default_font_path = "/system/fonts/DroidSans.ttf"

完成以上步骤后,再次运行代码,应该就能正常生成图片了。

我们增加了一些改进的

文件名命名方法:编号. 词语 时间戳
保存 /storage/emulated/0/文件/代码print相关/结构图/
没有就新建
中文字体 /storage/emulated/0/文件/字体大全/字体包/宋体.ttf
其它中文字体 /storage/emulated/0/文件/字体大全/字体包/
英语字体 /storage/emulated/0/文件/字体大全/
这个目录下检索可用英语.ttf,如果需要英语的话
文件名没有库或者样式就省略掉

改进的代码

这段代码比较长,你可以按照以下代码来更新你的程序:

import os
import time
from PIL import Image, ImageDraw, ImageFont
import jieba

def generate_image_with_white_bg(text, font_path, output_path):
    # 设置图片大小和背景颜色
    image_width = 800
    image_height = 600
    bg_color = (255, 255, 255)  # 白色

    # 创建图片对象
    image = Image.new("RGB", (image_width, image_height), bg_color)
    draw = ImageDraw.Draw(image)

    # 设置字体和字体大小
    font_size = 36
    font = ImageFont.truetype(font_path, font_size)

    # 将文本按行分割
    lines = text.split("\n")

    # 绘制文本
    y = 50  # 初始纵坐标
    for line in lines:
        words = jieba.lcut(line)  # 分词去重
        for word in words:
            word = word.replace(",", " ").replace("。", " ").replace("?", " ")  # 替换标点符号为空格
            draw.text((50, y), word, fill=(0, 0, 0), font=font)  # 绘制文本
            y += 50  # 纵坐标递增

    # 保存图片
    image.save(output_path)

def generate_image_with_black_bg(text, font_path, output_path):
    # 设置图片大小和背景颜色
    image_width = 800
    image_height = 600
    bg_color = (0, 0, 0)  # 黑色

    # 创建图片对象
    image = Image.new("RGB", (image_width, image_height), bg_color)
    draw = ImageDraw.Draw(image)

    # 设置字体和字体大小
    font_size = 36
    font = ImageFont.truetype(font_path, font_size)

    # 将文本按行分割
    lines = text.split("\n")

    # 绘制文本
    y = 50  # 初始纵坐标
    for line in lines:
        words = jieba.lcut(line)  # 分词去重
        for word in words:
            word = word.replace(",", " ").replace("。", " ").replace("?", " ")  # 替换标点符号为空格
            draw.text((50, y), word, fill=(255, 255, 255), font=font)  # 绘制文本
            y += 50  # 纵坐标递增

    # 保存图片
    image.save(output_path)

def main():
    # 输入文本内容
    print("请输入多行文本内容,以空行结束:")
    text = ""
    while True:
        line = input()
        if line == "":
            break
        text += line + "\n"

    # 创建保存路径
    output_dir = "/storage/emulated/0/文件/代码print相关/结构图/"
    os.makedirs(output_dir, exist_ok=True)

    # 初始化时间戳
    timestamp = int(time.time())

    # 获取中文字体路径
    chinese_font_path = "/storage/emulated/0/文件/字体大全/字体包/宋体.ttf"

    # 获取英文字体路径
    english_font_path = None
    english_fonts_dir = "/storage/emulated/0/文件/字体大全/"
    for filename in os.listdir(english_fonts_dir):
        if filename.endswith(".ttf"):
            english_font_path = os.path.join(english_fonts_dir, filename)
            break

    # 生成白底黑字宋体图片
    white_bg_output_path = os.path.join(output_dir, "{}.{}.jpg".format(len(text), timestamp))
    generate_image_with_white_bg(text, chinese_font_path, white_bg_output_path)

    # 生成黑底白字宋体图片
    black_bg_output_path = os.path.join(output_dir, "{}.{}.jpg".format(len(text), timestamp))
    generate_image_with_black_bg(text, chinese_font_path, black_bg_output_path)

    print("白底黑字宋体图片已生成,保存路径为:{}".format(white_bg_output_path))
    print("黑底白字宋体图片已生成,保存路径为:{}".format(black_bg_output_path))

    if english_font_path is not None:
        # 生成白底黑字英语图片
        white_bg_output_path = os.path.join(output_dir, "{}e.{}.jpg".format(len(text), timestamp))
        generate_image_with_white_bg(text, english_font_path, white_bg_output_path)

        # 生成黑底白字英语图片
        black_bg_output_path = os.path.join(output_dir, "{}e.{}.jpg".format(len(text), timestamp))
        generate_image_with_black_bg(text, english_font_path, black_bg_output_path)

        print("白底黑字英语图片已生成,保存路径为:{}".format(white_bg_output_path))
        print("黑底白字英语图片已生成,保存路径为:{}".format(black_bg_output_path))

if __name__ == "__main__":
    main()

这个程序会根据输入的文本生成4张图片,分别是白底黑字宋体图片、黑底白字宋体图片、白底黑字英语图片和黑底白字英语图片。其中,中文字体使用的是/storage/emulated/0/文件/字体大全/字体包/宋体.ttf,英文字体则是在/storage/emulated/0/文件/字体大全/目录下查找的第一个.ttf文件作为默认字体。保存路径为/storage/emulated/0/文件/代码print相关/结构图/,文件名格式为编号. 词语 时间戳.jpg。如果没有对应的库或者样式,则省略掉,例如只有编号和时间戳的情况。

请注意,英文字体在中文文本中可能会出现乱码,需要根据实际情况进行调整。

结果

在这里插入图片描述
让我们看看有没有这个文件,可以看到只生成的两个图片
在这里插入图片描述
这样对我来说就是基本有一个雏形了
在这里插入图片描述
前面是用中文打的,我的字体夹还真包里有很多字体,目前可能晕倒。
在这里插入图片描述
这是用英文打的,就是2个框框加2个XX,可以看到是俩扑克牌!

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

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

相关文章

基于MFC和OpenCV实现人脸识别

基于MFC和OpenCV实现人脸识别 文章目录 基于MFC和OpenCV实现人脸识别1. 项目说明1. 创建项目2. 启动窗口3. 登录窗口-添加窗口、从启动窗口跳转4. 启动窗口-美化按钮5. 登录窗口-美化按钮、雪花视频6. 注册窗口-美化按钮、雪花视频、从启动窗口跳转7. 注册窗口-开启摄像头8. 注…

小谈设计模式(15)—观察者模式

小谈设计模式&#xff08;15&#xff09;—观察者模式 专栏介绍专栏地址专栏介绍 观察者模式核心思想主要角色Subject&#xff08;被观察者&#xff09;ConcreteSubject&#xff08;具体被观察者&#xff09;Observer&#xff08;观察者&#xff09;ConcreteObserver&#xff0…

Linux CentOS7 vim多文件与多窗口操作

窗口是可视化的分割区域。Windows中窗口的概念与linux中基本相同。连接xshell就是在Windows中新建一个窗口。而vim打开一个文件默认创建一个窗口。同时&#xff0c;Vim打开一个文件也就会建立一个缓冲区&#xff0c;打开多个文件就会创建多个缓冲区。 本文讨论vim中打开多个文…

STM32CubeMX学习笔记-USB接口使用(CDC虚拟串口)

STM32CubeMX学习笔记-USB接口使用&#xff08;CDC虚拟串口&#xff09; 一、USB简介二、新建工程1. 打开 STM32CubeMX 软件&#xff0c;点击“新建工程”2. 选择 MCU 和封装3. 配置时钟4. 配置调试模式 三、USB3.1 参数配置3.3 配置时钟3.4 USB Device 四、生成代码五、查看端口…

王道考研操作系统——I/O管理

I/O设备的基本概念 键盘&#xff1a;输入设备&#xff08;把设备准备好的数据读入计算机当中&#xff09;&#xff1b; 显示器&#xff1a;输出设备&#xff08;把计算机中准备好的数据写出到设备上&#xff09;&#xff1b; 移动硬盘&#xff1a;既是输入又是输出 中断驱动…

近三年3D点云顶会论文及源码合集,含2023最新

目前2D图像识别技术早已成熟&#xff0c;但2D的图像信息只有XY两个维度&#xff0c;而3D点云能够提供三维世界的信息&#xff0c;因此在自动驾驶、机器人和增强现实等各种领域都得到了广泛的应用。 近年来随着深度学习的发展&#xff0c;作为计算机视觉新兴研究热点的3D点云技…

python利用matplotlib绘图,对于中文和负号不显示,显示方框“口口”完美解决办法!!

文章目录 一、问题展示二、问题分析三、解决办法四、结果展示 一、问题展示 二、问题分析 可以发现对中文&#xff0c;以及负号不显示。 三、解决办法 import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [usimHei] # 显示中文 plt.rcParams[axes.unicode_mi…

Task1:

""" 重置root管理员密码 """ step1: 在shell界面输入重启命令&#xff1b; step2: 重启过程中出现此界面&#xff0c;快速按键盘‘e’, 进入系统内核程序&#xff1b; step3: 在系统系统内核程序内&#xff0c;移动光标至Linux 参数这…

10.0 探索API调试事件原理

本章笔者将通过Windows平台下自带的调试API接口实现对特定进程的动态转存功能&#xff0c;首先简单介绍一下关于调试事件的相关信息&#xff0c;调试事件的建立需要依赖于DEBUG_EVENT这个特有的数据结构&#xff0c;该结构用于向调试器报告调试事件。当一个程序发生异常事件或者…

栈的应用场景(二)

有效的括号匹配 1.题目2.图分析3.代码实现 1.题目 2.图分析 3.代码实现 class Solution {public boolean isValid(String s) {//创建一个栈,来放左括号.Stack<Character> stack new Stack<>();//遍历字符串,左括号放进栈for(int i 0 ; i < s.length(); i){ch…

趋势列表上又多了两个漏洞!

CVE-2023-24955 和 CVE-2023-29360 来自微软产品 5 月和 6 月的安全补丁报告。它们之所以特别危险&#xff0c;是因为出现了公开漏洞利用。 以下是详细信息。 第一个漏洞 CVE-2023-24955存在于 Microsoft SharePoint Server 中。它可导致远程代码执行。 它与覆盖随后由服务器执…

postgresql-备份与恢复

postgresql-备份与恢复 基本概念备份类型物理备份与逻辑备份在线备份与离线备份全量备份与增量备份 备份恢复工具备份与恢复逻辑备份与还原备份单个数据库psqlpg_dumppg_store 备份整个集群 基本概念 服务器系统错误、硬件故障或者人为失误都可能导致数据的丢失或损坏。因此&am…

Ai项目十四:基于 LeNet5 的手写数字识别及训练

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 pytorch复现lenet5模型&#xff0c;并检测自己手写的数字图片。 利用torch框架搭建模型相对比较简单&#xff0c;但是也会遇到很多问题&#xff0c;网上资料很多&#xff0c;搭建模型的方法大同小异&#xff0c;…

匿名上位机V7波形显示教程-简单能用

匿名上位机V7波形显示教程-简单能用 匿名上位机V7下位机数据格式根据匿名上位机V7的手册说明文档&#xff0c;编写对应的指令在主函数中初始化ANDmessage驱动连接匿名上位机V7 匿名上位机V7下位机数据格式 DATA区域内容&#xff1a; 举例说明DATA区域格式&#xff0c;例如上文&…

Altium Designer 批量添加元器件后缀

Altium Designer 批量添加元器件后缀 方法一方法二可能出现的问题要注意 方法一 您可以使用 Altium Designer 中的“批量修改元器件名称”功能来批量添加元器件后缀。具体步骤如下&#xff1a; 1.为了方便显示 操作流程&#xff0c;我这里复制了几个原理图的文件&#xff0c;粘…

【漏洞复现】用友GPR-U8 slbmbygr SQL注入漏洞

文章目录 一、漏洞描述二、网络空间搜索引擎搜索三、漏洞利用 一、漏洞描述 用友GRP-U8是面向政府及行政事业单位的财政管理应用。北京用友政务软件有限公司GRP-U8 SQL注入漏洞。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/fe260ff4d6d14abeb0e576e4bbf3c385.png 二…

计算机组成原理期末复习

第一章 上机前的准备&#xff1a;建立数学模型、确定计算方法和编制解题程序n位操作码有 2 n 2^n 2n种不同操作主储存器&#xff08;主存/内存&#xff09;包括存储体M、各种逻辑部件及控制电路。储存体有多个储存单元&#xff0c;储存单元有多个储存元件&#xff0c;每个存储…

SDL2绘制ffmpeg解析的mp4文件

文章目录 1.FFMPEG利用命令行将mp4转yuv4202.ffmpeg将mp4解析为yuv数据2.1 核心api: 3.SDL2进行yuv绘制到屏幕3.1 核心api 4.完整代码5.效果展示 本项目采用生产者消费者模型&#xff0c;生产者线程&#xff1a;使用ffmpeg将mp4格式数据解析为yuv的帧&#xff0c;消费者线程&am…

latex表格内容换行

问题描述&#xff1a; 在用latex表格中编写公式时&#xff0c;可能出现公式太长&#xff0c;表格中后面的内容不能在文档中呈现&#xff0c;如下图1&#xff0c;故要进行行内内容的换行&#xff0c;使内容呈现完全而传统的\换行后,换行内容会顶格&#xff0c;如图2。 解决方…

PE文件之导入表

1. 导入表 2. 显示导入表信息的例子 ; 作用: 将RVA地址转成FOA即文件偏移 ; 参数: _pFileHdr 指向读到内存中文件的基址指针 ; _dwRVA 目标RVA地址 ; 返回: 目标RVA转成文件偏移的值 RVA2FOA PROC USES esi edi edx, _pFileHdr:PTR BYTE, _dwRVA:DWORDmov esi, _pFil…