使用PIL在图像上添加文本


93

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

在对其进行了一些研究之后,我发现PIL(Python Imaging Library)可以帮助我做到这一点。因此,我尝试了几个示例以了解其工作原理,并设法在图像上写了文字。但是我认为Python Shell在Web环境中使用和尝试时会有一些区别。我的意思是textarea上的文本以px为单位很大。使用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添加文本区域。文本区域也是position:绝对和固定大小。

我应该将其放置在表单中以便在图像上获取文本区域的坐标吗?我想在用户单击时在图像上写文本并将其保存在图像上。


为什么要使用PIL在图像上写文本(我不确定PIL是否可以帮上忙)。在叠加层中显示文本是否足够好,叠加层是滑块中最常用的文本。
2013年

1
我需要一个项目来保存图像。Pil可以使用ImageDraw在图像上绘制文本,不知道是否还有其他方法。
阿波斯托洛斯

如果您可以提供您正在使用的Python代码,这将有所帮助。
lalit

尚未在Django中实现。我试图查看PIL如何在交互式python控制台中工作。想要先查看它是否有效,然后再在Django中进行传输。
阿波斯托洛斯

您的代码中的$符号是什么?
Mugen '18

Answers:


171

我认为其中提供的ImageFont模块PIL应有助于解决文本字体大小问题。只需检查哪种字体类型和大小适合您,然后使用以下功能更改字体值即可。

# 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

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


1
那是我最初的想法。那么我是否需要将字体保存在Web服务器中的特定文件夹中才能工作?我认为是。包装文字吗?有没有一种标准的方法?
阿波斯托洛斯

您可以将字体文件保留在Web服务器中的任何位置。只要确保您提供的路径是正确的即可。
2013年

7
@lalit我在Windows计算机上尝试了您的代码,但字体出现错误self.font = core.getfont(file, size, index, encoding) IOError: cannot open resource。如何提供字体文件的路径?
LWZ

3
@LWZ,要运行上面的代码,只需确保字体文件在您正在执行上面的代码的当前目录中即可。如果您在程序中使用它,只需指定文件的完整路径即可,例如“ C:\ Windows \ Fonts \ sans-serif.ttf”。您需要确保此处的另一件事是为文件赋予适当的读取权限。
2013年

3
字体= ImageFont.truetype(“ ./ arial.ttf”,30); draw.textsize(msg,font = font);
WeizhongTu

16

您可以在项目的根目录中创建一个目录“ fonts”,然后将字体(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)

15

更加简单的示例(用黑色绘制“ Hello world!”,图像的左上角带有默认字体):

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

6

首先,您必须下载一种字体类型...例如:https : //www.wfonts.com/font/microsoft-sans-serif

之后,使用以下代码绘制文本:

from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw 
img = Image.open("filename.jpg")
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(r'filepath\..\sans-serif.ttf', 16)
draw.text((0, 0),"Draw This Text",(0,0,0),font=font) # this will draw text with Blackcolor and 16 size

img.save('sample-out.jpg')

4

使用枕头,您还可以使用ImageDraw模块在图像上进行绘制。您可以绘制线,点,椭圆,矩形,弧形,位图,和弦,拼接,多边形,形状和文本。

from PIL import Image, ImageDraw
blank_image = Image.new('RGBA', (400, 300), 'white')
img_draw = ImageDraw.Draw(blank_image)
img_draw.rectangle((70, 50, 270, 200), outline='red', fill='blue')
img_draw.text((70, 250), 'Hello World', fill='green')
blank_image.save('drawn_image.jpg')

我们使用new()方法创建一个Image对象。这将返回一个没有加载图像的Image对象。然后,我们在保存图像之前向图像添加一个矩形和一些文本。


3

其他答案中未提及的一件事是检查文本大小。通常需要确保文本适合图像(例如,如果尺寸过大,则缩短文本)或确定绘制文本的位置(例如,对齐的文本顶部居中)。Pillow / PIL提供了两种检查文本大小的方法,一种通过ImageFont,另一种通过ImageDraw。如下所示,该字体不能处理多行,而ImageDraw可以。

In [28]: im = Image.new(mode='RGB',size=(240,240))                                                            
In [29]: font = ImageFont.truetype('arial')
In [30]: draw = ImageDraw.Draw(im)
In [31]: t1 = 'hello world!'
In [32]: t2 = 'hello \nworld!'
In [33]: font.getsize(t1), font.getsize(t2) # the height is the same
Out[33]: ((52, 10), (60, 10)) 
In [35]: draw.textsize(t1, font), draw.textsize(t2, font)  # handles multi-lined text
Out[35]: ((52, 10), (27, 24)) 

-7

要在图像文件上添加文本,只需复制/粘贴以下代码

<?php
$source = "images/cer.jpg";
$image = imagecreatefromjpeg($source);
$output = "images/certificate".rand(1,200).".jpg";
$white = imagecolorallocate($image,255,255,255);
$black = imagecolorallocate($image,7,94,94);
$font_size = 30;
$rotation = 0;
$origin_x = 250;
$origin_y = 450;
$font = __DIR__ ."/font/Roboto-Italic.ttf";
$text = "Dummy";
$text1 = imagettftext($image,$font_size,$rotation,$origin_x,$origin_y,$black,$font,$text);
     imagejpeg($image,$output,99);
?> <img src="<?php echo $output; ?>"> <a href="<?php echo $output;    ?>" download="<?php echo $output; ?>">Download Certificate</a>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.