Python图像处理:Pillow库实现自动换行文本标注
Python凭借其丰富的开源库,已成为图像处理领域的领先编程语言。Pillow便是其中一个常用的图像处理库,它简洁易用且文档完善,常用于图像缩放、裁剪、亮度调整和标注等操作。
然而,Pillow在文本标注方面存在一个问题:当文本超过文本框宽度时,不会自动换行。Pillow库本身并没有提供此功能,需要我们自行编写逻辑实现。
本教程将演示如何使用Pillow库在Python中添加一个自动换行的文本框,从而实现正确的图像文本标注。最终效果如下:
上图是我的Dev.to个人资料截图,我们将以此为例进行讲解。绿色文本框即为我们添加的文本标注。
准备工作
本教程要求您具备基本的Python编程知识,例如条件语句(if, else)、for循环等。您还需要以下工具和软件:
- Python3 : 用于运行Python脚本的解释器。
- Pillow: Python图像处理库。
- 代码编辑器: 例如Pycharm、VScode等。
创建新项目
按照以下步骤创建一个新项目:
A. 使用终端/命令行创建新文件夹:
mkdir image_annotation
B. 使用pip安装virtualenv (如果您已安装,请跳过此步骤):
pip install virtualenv
C. 将工作目录切换到image_annotation文件夹:
cd image_annotation
D. 创建新的虚拟环境:
virtualenv env
E. 激活虚拟环境 (Windows使用命令提示符):
Windows:
.\env\Scripts\activate
Linux/macOS:
source env/bin/activate
F. 使用pip安装Pillow库:
pip install pillow
在代码编辑器中打开项目,并在项目文件夹中创建一个名为script.py
的新Python文件。
准备基础图像
您要标注的图像即为基础图像。使用Pillow的ImageDraw
模块打开并准备图像。在script.py
文件中编写以下代码:
from PIL import Image, ImageDraw, ImageFont image_file = "path_to_image" # 请替换为您的图片路径 # 打开图像 image = Image.open(image_file) # 初始化ImageDraw draw = ImageDraw.Draw(image)
添加图像标注
Pillow可以添加纯文本和带背景填充的文本框,文本可以是单行或多行。本教程重点讲解如何添加多行文本框。
ImageDraw.multiline_text()
方法可以添加多行纯文本,但没有背景填充。ImageDraw.rectangle()
方法可以添加带背景填充的文本框。
在script.py
文件中添加以下代码:
mkdir image_annotation
这段代码设置了文本、字体和文本框宽度。x
和y
变量表示绘图的起始点,end_x
和end_y
表示文本框的右下角坐标。文本框的宽度和高度分别为200和50。
ImageDraw.rectangle()
和ImageDraw.multiline_text()
方法分别用于绘制文本框和多行文本。image.show()
方法用于显示处理后的图像。您可以使用image.save("new_image.png")
保存图像。结果如下:
上图中标注仍然存在问题,多行文本没有自动换行。下一节将讲解如何解决这个问题。
实现自动换行
换行符n
用于指定换行位置。在之前的例子中,换行符n
之后的内容会换行。但在实际应用中,文本长度通常是动态的,很难确定换行符的位置。
Pillow的ImageDraw
模块的.textlength()
属性可以计算文本长度,将其与文本框宽度进行比较,从而确定换行位置。
在script.py
文件顶部(import语句之后)创建一个名为wrap_text()
的新函数,包含自动换行逻辑:
pip install virtualenv
在text
, font
, max_width
变量之后添加以下代码:
cd image_annotation
将draw.multiline_text()
方法替换为以下代码:
virtualenv env
从文本中删除换行符n
并运行代码:
.\env\Scripts\activate
运行结果显示文本仍然超出文本框高度。虽然文本可以根据文本框宽度自动调整,但文本框高度固定,导致文本溢出。
设置动态文本框高度
动态文本框高度根据文本行数确定。第一步是将文本框的end_y
变量更改为动态值:
source env/bin/activate
此公式是在多次试验后得到的,它似乎是此用例中获得动态文本框高度的最佳解决方案。wrapped_lines
列表包含所有要添加到文本框的行,因此该列表的长度等于文本框的总行数。
结果如下:
您可能需要将总行数乘以不同的值才能获得适合您用例的完美解决方案。
添加文本填充
文本距离文本框边缘太近,影响可读性和样式。可以通过在文本框内添加填充来解决这个问题。在script.py
文件中添加一个新的padding
变量并更改文本框尺寸:
pip install pillow
这段代码允许文本和文本框边缘之间留出间距。
添加指针
指针可以方便地指示标注/标签所指的图像部分。指针应该位于标注之前。这意味着指针将绘制在文本框的当前位置,而文本框将向右移动。
因此,文本框的x轴将与新的box_x
变量关联。此更改也必须反映在使用文本框x轴的其他变量中。以下是更新后的代码:
mkdir image_annotation
在上面的代码中,ImageDraw.circle()
方法(其中10是半径)用于在指定点绘制指针。box_x
变量是文本框x轴的新值。
完整代码
以下是script.py
文件的完整代码:
pip install virtualenv
结论
图像处理并不总是像看起来那么困难。虽然有些图像处理库无法直接用其模块解决您的问题,但您可以使用现有模块为您的用例实现特定解决方案。这就是编码的魅力——能够用自定义和特定解决方案来解决问题。
在本教程中,您学习了如何使用Python的Pillow库来标注图像,添加自动换行的多行文本框等。您还学习了如何编写可以帮助您进行图像处理的数学公式。
请参考Pillow文档以详细了解所用模块。
以上是使用 Python 的 Pillow 库在图像上包裹和渲染多行文本的详细内容。更多信息请关注PHP中文网其他相关文章!

每天学习Python两个小时是否足够?这取决于你的目标和学习方法。1)制定清晰的学习计划,2)选择合适的学习资源和方法,3)动手实践和复习巩固,可以在这段时间内逐步掌握Python的基本知识和高级功能。

Python在Web开发中的关键应用包括使用Django和Flask框架、API开发、数据分析与可视化、机器学习与AI、以及性能优化。1.Django和Flask框架:Django适合快速开发复杂应用,Flask适用于小型或高度自定义项目。2.API开发:使用Flask或DjangoRESTFramework构建RESTfulAPI。3.数据分析与可视化:利用Python处理数据并通过Web界面展示。4.机器学习与AI:Python用于构建智能Web应用。5.性能优化:通过异步编程、缓存和代码优

Python在开发效率上优于C ,但C 在执行性能上更高。1.Python的简洁语法和丰富库提高开发效率。2.C 的编译型特性和硬件控制提升执行性能。选择时需根据项目需求权衡开发速度与执行效率。

Python在现实世界中的应用包括数据分析、Web开发、人工智能和自动化。1)在数据分析中,Python使用Pandas和Matplotlib处理和可视化数据。2)Web开发中,Django和Flask框架简化了Web应用的创建。3)人工智能领域,TensorFlow和PyTorch用于构建和训练模型。4)自动化方面,Python脚本可用于复制文件等任务。

Python在数据科学、Web开发和自动化脚本领域广泛应用。1)在数据科学中,Python通过NumPy、Pandas等库简化数据处理和分析。2)在Web开发中,Django和Flask框架使开发者能快速构建应用。3)在自动化脚本中,Python的简洁性和标准库使其成为理想选择。

Python的灵活性体现在多范式支持和动态类型系统,易用性则源于语法简洁和丰富的标准库。1.灵活性:支持面向对象、函数式和过程式编程,动态类型系统提高开发效率。2.易用性:语法接近自然语言,标准库涵盖广泛功能,简化开发过程。

Python因其简洁与强大而备受青睐,适用于从初学者到高级开发者的各种需求。其多功能性体现在:1)易学易用,语法简单;2)丰富的库和框架,如NumPy、Pandas等;3)跨平台支持,可在多种操作系统上运行;4)适合脚本和自动化任务,提升工作效率。

可以,在每天花费两个小时的时间内学会Python。1.制定合理的学习计划,2.选择合适的学习资源,3.通过实践巩固所学知识,这些步骤能帮助你在短时间内掌握Python。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

禅工作室 13.0.1
功能强大的PHP集成开发环境

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver CS6
视觉化网页开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境