114

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

在对它进行了一些研究之后,我认为PIL(Python Imaging Library)可以帮助我做到这一点。所以我尝试了几个例子来看看它是如何工作的,我设法在图像上写了文字。Python Shell但是我认为当我在网络环境中尝试使用它时会有一些不同。我的意思是 textarea 上的文本在 px 中非常大。使用 PIL 时如何实现与 textarea 上相同大小的文本?

文本是多行的。我怎样才能使它在图像中也多行,使用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 添加文本区域。文本区域也是位置:绝对和固定大小。

我应该把它放在一个表单中,这样我就可以在图像上获取 textarea 的坐标了吗?我想在用户单击时在图像上写文字并将其保存在图像上。

4

9 回答 9

198

我认为可用的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.

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

于 2013-05-04T17:49:22.003 回答
24

更简单的例子(用黑色和图像左上角的默认字体绘制“Hello world!”):

...
from PIL import ImageDraw
...
ImageDraw.Draw(
    image  # Image
).text(
    (0, 0),  # Coordinates
    'Hello world!',  # Text
    (0, 0, 0)  # Color
)
于 2018-07-29T04:07:07.220 回答
17

您可以在项目的根目录中创建一个目录“字体”并将您的字体(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)
于 2014-07-20T04:23:32.953 回答
12

首先,您必须下载字体类型...例如: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')
于 2019-02-19T05:12:47.077 回答
10

首先安装枕头

pip install pillow

例子

from PIL import Image, ImageDraw, ImageFont

image = Image.open('Focal.png')
width, height = image.size 

draw = ImageDraw.Draw(image)

text = 'https://devnote.in'
textwidth, textheight = draw.textsize(text)

margin = 10
x = width - textwidth - margin
y = height - textheight - margin

draw.text((x, y), text)

image.save('devnote.png')

# optional parameters like optimize and quality
image.save('optimized.png', optimize=True, quality=50)
于 2020-12-04T07:11:53.530 回答
7

其他答案中未提及的一件事是检查文本大小。通常需要确保文本适合图像(例如,如果过大则缩短文本)或确定绘制文本的位置(例如对齐文本顶部居中)。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)) 
于 2019-08-15T19:22:27.597 回答
6

使用 Pillow,您还可以使用 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 对象。然后,我们在保存之前向图像添加一个矩形和一些文本。

于 2019-02-21T05:01:43.373 回答
3

我最近不得不实施同样的事情。我在pypi上创建了一个可能派上用场的包:pynter

您可以使用以下步骤将文本添加到图像:

  1. 下载图像:curl https://i.imgur.com/XQCKcC9.jpg -o ./image.jpg

  2. 下载字体:curl https://fonts.google.com/download?family=Roboto -o ./roboto.zip ; unzip ./roboto.zip -d ./Roboto

  3. pip install pynter

from pynter.pynter import generate_captioned
font_path = './Roboto/Roboto-Regular.ttf'
image_path = './image.jpg'
im = generate_captioned('China lands rover on Mars'.upper(), image_path=image_path, size=(1080, 1350),
                        font_path=font_path, filter_color=(0, 0, 0, 40))
im.show()
im.convert('RGB').save('drawn_image.jpg')

这将是结果:

在此处输入图像描述

于 2021-05-22T11:36:32.477 回答
-8

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

<?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>
于 2019-09-04T09:54:31.127 回答