Python 将指定的文字写到指定的jpeg图像中
你可以使用Python的PIL库(Python Imaging Library)来实现将指定的文字写入JPEG图像中的功能。以下是一个示例代码:
from PIL import Image, ImageDraw, ImageFont
def add_text_to_image(image_path, text, output_path):
image = Image.open(image_path)
draw = ImageDraw.Draw(image)
font = ImageFont.truetype("arial.ttf", 36) # 使用自定义字体和大小
text_width, text_height = draw.textsize(text, font=font)
x = (image.width - text_width) // 2 # 将文字居中放置
y = (image.height - text_height) // 2
draw.text((x, y), text, fill=(255, 255, 255), font=font) # 白色文字颜色
image.save(output_path)
# 示例用法
image_path = "example.jpg" # 输入图像路径
output_path = "output.jpg" # 输出图像路径
text = "Hello, World!" # 要写入的文字
add_text_to_image(image_path, text, output_path)
在这个例子中,我们首先导入了PIL库中的Image
、ImageDraw
和ImageFont
模块。然后,我们定义了一个函数add_text_to_image
,该函数接受输入图像路径、要写入的文字和输出图像路径作为参数。
在函数内部,我们打开输入图像,创建一个draw
对象并加载一个自定义字体(在此示例中为Arial字体,大小为36)。然后,我们计算要写入的文字的宽度和高度,并将其居中放置在图像上。
最后,我们使用draw.text
方法将文字写入图像,并保存输出图像。
你可以根据需要调整字体、大小、颜色等参数来满足你的需求。请确保已安装PIL库(可通过pip install pillow
进行安装),并替换示例中的输入图像路径、输出图像路径和要写入的文字。
上面的示例中,如果是中文的文本,显示为乱码,如何解决
如果要在图像中写入中文文本,需要确保使用支持中文字符的字体,并将字体文件路径传递给ImageFont.truetype()
函数。以下是一个修改后的示例代码:
from PIL import Image, ImageDraw, ImageFont
def add_text_to_image(image_path, text, output_path):
image = Image.open(image_path)
draw = ImageDraw.Draw(image)
# 使用中文字体和大小
font = ImageFont.truetype("SimSun.ttf", 36, encoding="utf-8")
text_width, text_height = draw.textsize(text, font=font)
x = (image.width - text_width) // 2 # 将文字居中放置
y = (image.height - text_height) // 2
draw.text((x, y), text, fill=(255, 255, 255), font=font) # 白色文字颜色
image.save(output_path)
# 示例用法
image_path = "example.jpg" # 输入图像路径
output_path = "output.jpg" # 输出图像路径
text = "你好,世界!" # 要写入的中文文字
add_text_to_image(image_path, text, output_path)
在此示例中,我们修改了以下部分:
- 引入了具有中文支持的字体文件
SimSun.ttf
。 - 在
ImageFont.truetype()
函数中添加了encoding="utf-8"
参数,以便正确地解析中文字符。
请确保已将适当的中文字体文件(比如宋体)放置在与脚本文件相同的目录中,或者提供字体文件的完整路径。然后,根据需要替换示例中的输入图像路径、输出图像路径和要写入的中文文字。
文字太长的话,如何换行
如果要在图像中写入的文字太长,需要处理换行。可以使用PIL库中textwrap
模块来实现自动换行的功能。以下是修改后的示例代码:
from PIL import Image, ImageDraw, ImageFont
import textwrap
def add_text_to_image(image_path, text, output_path):
image = Image.open(image_path)
draw = ImageDraw.Draw(image)
# 使用中文字体和大小
font = ImageFont.truetype("SimSun.ttf", 36, encoding="utf-8")
# 设置最大宽度和行间距
max_width = 400
line_spacing = 10
# 文本换行
wrapped_text = textwrap.wrap(text, width=int(max_width/font.getsize("字")[0]))
y = (image.height - (font.getsize(wrapped_text[0])[1] + line_spacing) * len(wrapped_text)) // 2
for line in wrapped_text:
text_width, text_height = font.getsize(line)
x = (image.width - text_width) // 2 # 将文字居中放置
draw.text((x, y), line, fill=(255, 255, 255), font=font) # 白色文字颜色
y += text_height + line_spacing
image.save(output_path)
# 示例用法
image_path = "example.jpg" # 输入图像路径
output_path = "output.jpg" # 输出图像路径
text = "这是一个非常长的文本,将会自动进行换行以适应图像宽度。换行功能可以确保较长的文本在图像中显示得更好。" # 要写入的文字
add_text_to_image(image_path, text, output_path)
在此示例中,我们进行了以下修改:
- 引入了
textwrap
模块,用于自动换行文本。 - 设置了最大宽度和行间距变量,以便根据需要调整换行的逻辑。
- 使用
textwrap.wrap()
函数将文本进行换行处理,传递的width
参数是根据字体大小和最大宽度计算得出的。 - 根据每行文本的高度和行间距来确定下一行的y坐标。
请注意,根据输入的文本长度、字体大小和图像宽度,你可能需要根据需要调整最大宽度和行间距值,以获得预期的效果。
文本位置修改下,水平方向从距离左边为210像素开始写文本,垂直方向居中
要将文本在图像中的位置修改为水平方向距离左边为210像素,垂直方向居中,你可以在代码中进行相应的调整。以下是修改后的示例代码:
from PIL import Image, ImageDraw, ImageFont
import textwrap
def add_text_to_image(image_path, text, output_path):
image = Image.open(image_path)
draw = ImageDraw.Draw(image)
# 使用中文字体和大小
font = ImageFont.truetype("SimSun.ttf", 36, encoding="utf-8")
# 设置最大宽度和行间距
max_width = image.width - 210 # 水平方向距离左边为210像素
line_spacing = 10
# 文本换行
wrapped_text = textwrap.wrap(text, width=int(max_width/font.getsize("字")[0]))
text_height = (font.getsize(wrapped_text[0])[1] + line_spacing) * len(wrapped_text)
y = (image.height - text_height) // 2 # 垂直方向居中
for line in wrapped_text:
text_width, _ = font.getsize(line)
x = 210 # 水平方向距离左边为210像素
draw.text((x, y), line, fill=(255, 255, 255), font=font) # 白色文字颜色
y += font.getsize(line)[1] + line_spacing
image.save(output_path)
# 示例用法
image_path = "example.jpg" # 输入图像路径
output_path = "output.jpg" # 输出图像路径
text = "这是一个非常长的文本,将会自动进行换行以适应图像宽度。换行功能可以确保较长的文本在图像中显示得更好。" # 要写入的文字
add_text_to_image(image_path, text, output_path)
在以上修改后的代码中,我们进行了如下调整:
- 将水平方向的文本起始位置
x
设置为210
,表示距离左边为 210 像素。 - 当计算垂直方向居中时,使用了计算出来的文本高度。
请根据你的需求修改示例中的输入图像路径、输出图像路径和要写入的文字,并根据需要调整文本起始位置 x
的值。