使用PIL在图像上添加文本

2024-04-19 00:03:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个加载图像的应用程序,当用户单击它时,会出现此图像的文本区域(使用jquery),用户可以在其中在图像上写入一些文本。应该添加到图像上。

在做了一些研究之后,我认为PIL(Python Imaging Library)可以帮助我做到这一点。所以我试了几个例子来看看它是如何工作的,我设法在图像上写下了文字。但我认为当我在使用Python Shell和web环境中尝试时,会有一些不同。我是说文本区的文本在px中很大。当使用PIL作为文本区域上的PIL时,如何获得相同大小的文本?

文本是多行的。如何在图像中使用PIL使其多行?

有没有比使用PIL更好的方法?我不完全确定这是否是最好的实现。

html格式:

<img src="images/test.jpg"/>

这是正在编辑的图像

var count = 0;
$('textarea').autogrow();
$('img').click(function(){
    count = count + 1;
    if (count > 1){
        $(this).after('<textarea />');
        $('textarea').focus();
    }   
});

添加文本区域的jquery。 文本区域也是位置:绝对和固定大小。

我应该把它放在一个表格里,这样我就能得到图像上文本区域的坐标吗? 我想在用户单击并保存到图像上时在图像上写入文本。


Tags: 用户图像文本应用程序区域imgpilcount
3条回答

我认为PIL中提供的ImageFont模块应该有助于解决文本字体大小问题。只需检查适合您的字体类型和大小,并使用以下函数更改字体值。

# font = ImageFont.truetype(<font-file>, <font-size>)
# font-file should be present in provided path.
font = ImageFont.truetype("sans-serif.ttf", 16)

所以你的代码看起来类似于:

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

img = Image.open("sample_in.jpg")
draw = ImageDraw.Draw(img)
# font = ImageFont.truetype(<font-file>, <font-size>)
font = ImageFont.truetype("sans-serif.ttf", 16)
# draw.text((x, y),"Sample Text",(r,g,b))
draw.text((0, 0),"Sample Text",(255,255,255),font=font)
img.save('sample-out.jpg')

您可能需要付出额外的努力来计算字体大小。如果您想根据用户在TextArea中提供的文本量更改它。

要添加文本换行(多行文字),只需大致了解一行中可以包含多少个字符,然后您就可以为文本编写预处理函数,基本上可以找到每行中最后一个字符,并将该字符前面的空格转换为新行。

您可以在项目的根目录中创建一个“字体”目录,并将字体(sans-serif.ttf)文件放在其中。然后你可以做这样的东西:

fonts_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'fonts')
font = ImageFont.truetype(os.path.join(fonts_path, 'sans_serif.ttf'), 24)

更简单的例子(画“HelloWorld!”以黑色显示,默认字体位于图像左上角):

...
from PIL import ImageDraw
...
ImageDraw.Draw(
    image  # Image
).text(
    (0, 0),  # Coordinates
    'Hello world!',  # Text
    (0, 0, 0)  # Color
)

相关问题 更多 >