分享

使用Python批量给图片添加文字

 hercules028 2022-07-11 发布于四川
excelperfect

标签:PythonPillow
你知道Python可以帮助向图像中添加文本吗?虽然Python不是图形编辑软件,但它能够很好地处理图像文件。在本文中,将在多个图像上放置一个示例文本“ExcelPerfect”。不用手动操作,也不用使用一些昂贵的软件,可以使用Python轻易达到同样的效果。
这里需要使用PILLOW库(Python Imaging Library),使用pip命令安装:
pip install Pillow
Pillow库允许打开、修改和保存图片文件。
要导入Pillow库,需要使用:
import PIL
而不是:
import Pillow
我们将使用Pillow中的3个子模块:
  • Image:用于打开和保存图片文件的图像文件类。
  • ImageDraw:用于创建新图像的类,我们将使用它向图片中添加文本。
  • ImageFont:文本字体。
读取图片文件到Python
首先,读取图片文件到Python
import PIL
from PIL import (Image,
ImageFont,
ImageDraw)
img = Image.open(r'D:\完美Excel\flower.jpg')
如果使用的是Jupyter Notebook的话,可以使用内置函数display()notebook中显示图片,如下图1所示。
图片
1
字体
可以为添加到图片中的文字选择不同的字体。如果在Windows操作系统中,可以在Wondows搜索栏搜索“字体”,然后单击“字体设置”。
在“字体设置”中,可以看到许多不同的字体,也能从网上下载新字体供后面使用。
这里想使用字体“Gill Sans”,能够从设置中找到该字体文件的位置,如下图2所示。
图片
2
有了这个字体文件,现在可以创建一个字体对象,在Python中的图像上部绘制。在下面的代码行中:
1.第一个参数是字体文件的URL
2.第二个参数是字体大小。在这里使用的是30
font = ImageFont.truetype(r'C:\WINDOWS\FONTS\GILSANUB.TTF',30)
Python Pillow:添加文本到图片
现在需要创建一个ImageDraw对象来修改该图像。下面的draw.text()接受以下参数:
1.(1010)–起始位置的(xy)坐标
2.font–刚刚创建的ImageFont
3.fill–文本的RGB颜色值(255表示白色,0表示黑色)
draw = ImageDraw.Draw(img)
draw.text((10,10),'ExcelPerfect', font = font, fill = (255, 255, 255))
注意,ImageDraw对象实际上修改了Image对象。为了显示更新后的图像,可以再次使用display(img)
图片
3
将文本放置在左下角
要将文本放在右下角,需要做几件事:
1.确定文本的大小,这应该动态设置,因为每个图像的大小不同。
2.此外,动态确定文本的起始(xy)坐标。由于图像大小不同,坐标会有所不同。
可以通过调用size属性来获得图像(即画布)的大小。在本例中,我们的图像宽869像素,高633像素。
图片
4
我们将设置文本大小,使整个文本行大约占图像宽度的1/3
ImageFont对象的默认字体大小为10。要获取文本尺寸(宽度和高度)并计算比例因子,执行以下操作:
default_font_size = 10
text = 'ExcelPerfect'
text_width, text_height = ImageFont.truetype(r'C:\WINDOWS\FONTS\GILSANUB.TTF').getsize(text)
img = Image.open(r'D:\完美Excel\flower.jpg')
img_width, img_height = img.size
scaler = img_width/3/text_width
scaler
如下图5所示。
图片
5
在这个例子中,scaler大约是3.5,这意味着我们的字体大小将是10*3.5=35。文本宽度和高度也将相应缩放。
scale_text_font = int(default_font_size * scaler)
scale_text_width = int(scaler * text_width)
scale_text_height = int(scaler * text_height)
font = ImageFont.truetype(r'C:\WINDOWS\FONTS\GILSANUB.TTF', size = scale_text_font)
draw = ImageDraw.Draw(img)
start_x = img_width - scale_text_width - 20
start_y = img_height - scale_text_height - 20
draw.text((start_x, start_y), text = text, font = font, fill = (255,255,255))
img.save(r'D:\完美Excel\flower_w_text.jpg')
结果如下图6所示。
图片
6
添加文件到多个图片
要向多个图像添加文本,让我们将所有图像放在同一个文件夹中。然后可以使用os.listdir()从该文件夹中获取所有文件名,并处理每个文件。完整代码如下:
import os
from PIL import (Image,
ImageFont,
ImageDraw)
default_font_size = 10
text = 'ExcelPerfect'
text_width, text_height = ImageFont.truetype(r'C:\WINDOWS\FONTS\GILSANUB.TTF').getsize(text)
folder_path = r'D:\完美Excel\images'
for f in os.listdir(folder_path):
img = Image.open(rf'{folder_path}\{f}')
img_width, img_height = img.size
scaler = img_width/2/text_width
scale_text_font = int(default_font_size * scaler)
scale_text_width = int(scaler * text_width)
scale_text_height = int(scaler * text_height)
font = ImageFont.truetype(r'C:\WINDOWS\FONTS\GILSANUB.TTF', size = scale_text_font)
draw = ImageDraw.Draw(img)
start_x = img_width - scale_text_width - 20
start_y = img_height - scale_text_height - 20
draw.text((start_x, start_y), text = text, font = font, fill = (0,0,0))
file_name = f.split('.')[0] + '_w_text.jpg'
img.save(rf'{folder_path}\{file_name}')
注:本文学习整理自pythoninoffice.com,供有兴趣的朋友学习参考。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多