使用PIL在图像上添加文本
我有一个加载图像的应用程序,当用户点击它时,这个图像的文本区域(使用jquery
),用户可以在图像上写一些文本。 应该在Image上添加哪个
在做了一些研究后,我发现PIL
(Python Imaging Library)可以帮助我做到这一点。 所以我试了几个例子来看看它是如何工作的,我设法在图像上写文本。 但是我认为当我使用Python Shell
和Web环境进行尝试时会有一些差异。 我的意思是textarea上的文字在px中非常大。 在使用PIL作为textarea上的文本时,如何获得相同的文本大小?
文本是Multiline。 我怎样才能使它在图像多行,也使用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。 此外文本区域的位置:绝对和固定的大小。
我应该把它放在一个窗体,所以我可以得到textarea图像的坐标? 我想在用户点击时在图片上写文字并保存在图片上。
我认为PIL
ImageFont模块应该有助于解决文字字体大小的问题。 只要检查一下字体的types和大小是否适合你,并使用下面的函数来改变字体值。
# 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
提供的文本数量来更改它。
要添加文字换行(多行事物),只需粗略了解一行中可以有多less个字符,然后就可以为您的文本编写一个预处理函数,它基本上查找每行中最后一个字符,将此字符前的空格转换为换行符。
您可以在项目的根目录中创build一个目录“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)