Python 将指定的文字写到指定的jpeg图像中

Python 将指定的文字写到指定的jpeg图像中

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库中的ImageImageDrawImageFont模块。然后,我们定义了一个函数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)

在此示例中,我们修改了以下部分:

  1. 引入了具有中文支持的字体文件SimSun.ttf
  2. 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)

在此示例中,我们进行了以下修改:

  1. 引入了textwrap模块,用于自动换行文本。
  2. 设置了最大宽度和行间距变量,以便根据需要调整换行的逻辑。
  3. 使用textwrap.wrap()函数将文本进行换行处理,传递的width参数是根据字体大小和最大宽度计算得出的。
  4. 根据每行文本的高度和行间距来确定下一行的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)

在以上修改后的代码中,我们进行了如下调整:

  1. 将水平方向的文本起始位置 x 设置为 210,表示距离左边为 210 像素。
  2. 当计算垂直方向居中时,使用了计算出来的文本高度。

请根据你的需求修改示例中的输入图像路径、输出图像路径和要写入的文字,并根据需要调整文本起始位置 x 的值。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程