【问题标题】:How to convert a string to an image?如何将字符串转换为图像?
【发布时间】:2013-07-25 11:04:33
【问题描述】:

我一周前开始学习 python,想编写一个小程序,将电子邮件转换为图像 (.png),以便可以在论坛上共享,而不会冒着收到大量垃圾邮件的风险。

python 标准库似乎不包含可以执行此操作的模块,但我发现有一个 PIL 模块(PIL.ImageDraw)。

我的问题是我似乎无法让它工作。

所以基本上我的问题是:

  1. 如何在图像上绘制文本。
  2. 如何创建空白(白色)图像
  3. 有没有办法在不实际创建文件的情况下执行此操作,以便在保存之前在 GUI 中显示它?

当前代码:

import Image
import ImageDraw
import ImageFont

def getSize(txt, font):
    testImg = Image.new('RGB', (1, 1))
    testDraw = ImageDraw.Draw(testImg)
    return testDraw.textsize(txt, font)

if __name__ == '__main__':

    fontname = "Arial.ttf"
    fontsize = 11   
    text = "example@gmail.com"
    
    colorText = "black"
    colorOutline = "red"
    colorBackground = "white"


    font = ImageFont.truetype(fontname, fontsize)
    width, height = getSize(text, font)
    img = Image.new('RGB', (width+4, height+4), colorBackground)
    d = ImageDraw.Draw(img)
    d.text((2, height/2), text, fill=colorText, font=font)
    d.rectangle((0, 0, width+3, height+3), outline=colorOutline)
    
    img.save("D:/image.png")

【问题讨论】:

  • 你能告诉我们你已经尝试过什么以及哪里出了问题吗?
  • 我还没有任何东西。问题是我找不到 ImageDraw 模块的真实文档,所以我不知道如何使用它
  • @user1743130 似乎来自 pythonware.com 的 PIL 文档已被删除。您可以使用 python-imaging 模块附带的文档。
  • PIL枕叉的最新文档可以在here找到。枕头支持 Python 3,不像 PIL 本身。

标签: python python-imaging-library text-rendering


【解决方案1】:
  1. 使用ImageDraw.text - 但它不进行任何格式化,它只是在给定位置打印字符串

    img = Image.new('RGB', (200, 100))
    d = ImageDraw.Draw(img)
    d.text((20, 20), 'Hello', fill=(255, 0, 0))
    

    找出文字大小:

    text_width, text_height = d.textsize('Hello')
    
  2. 创建图像时,添加一个带有所需颜色(白色)的附加参数:

    img = Image.new('RGB', (200, 100), (255, 255, 255))
    
  3. 在您使用Image.save 方法保存图像之前,不会有文件。然后只需进行适当的转换即可将其放入您的 GUI 格式以供显示。这可以通过将图像编码到内存中的图像文件来完成:

    import cStringIO
    s = cStringIO.StringIO()
    img.save(s, 'png')
    in_memory_file = s.getvalue()
    

    或者如果你使用python3:

    import io
    s = io.BytesIO()
    img.save(s, 'png')
    in_memory_file = s.getvalue()
    

    然后可以将其发送到 GUI。或者您可以直接发送原始位图数据:

    raw_img_data = img.tostring()
    

【讨论】:

  • 有没有办法找出图像的大小?
  • @user1743130 已编辑 - 但请尝试查找文档。或者你可以只运行python,写import ImageDraw,然后写help(ImageDraw)help(ImageDraw.textsize)等。
  • textsize 似乎只是改变文本的大小,但我想知道图像必须有多大才能使文本适合(以像素为单位)
  • @user1743130 textsize 不会更改任何内容,它会告诉您文本的大小。因此,您可以创建一个“废品”图像来测试所需的大小,并在此基础上创建真实图像
  • 为什么我的问题中的代码对于 fontsize = 400 可以正常工作,但如果 fontsize 设置为 11,则文本未居中且图像高度太高?
【解决方案2】:

前 3 行不完整,当我没记错的时候。正确的代码是:

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

【讨论】:

  • 这在现代 Pillow 包中是必需的 - 在旧的、原始的 PILimport Image* 中是有效的,没有 PIL 子包。
  • 短代码from PIL import Image, ImageDraw, ImageFont
猜你喜欢
  • 2014-12-17
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多