簡體   English   中英

使用 PIL 在圖像上添加文本

[英]Add Text on Image using PIL

我有一個加載圖像的應用程序,當用戶單擊它時,會為該圖像顯示一個文本區域(使用jquery ),用戶可以在其中在圖像上寫一些文本。 應該在 Image 上添加。

在對它進行了一些研究之后,我認為PIL (Python 成像庫)可以幫助我做到這一點。 所以我嘗試了幾個例子來看看它是如何工作的,我設法在圖像上寫了文字。 但是我認為當我使用Python Shell和在 web 環境中嘗試時會有一些不同。 我的意思是 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。 文本區域也是位置:絕對和固定大小。

我應該把它放在一個表單中,這樣我就可以獲得圖像上 textarea 的坐標嗎? 我想在用戶單擊時在圖像上寫入文本並將其保存在圖像上。

我認為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提供的文本量來更改它。

要添加文本換行(多行內容),只需大致了解一行中可以出現多少個字符,然后您就可以為您的文本編寫一個預處理函數,它基本上可以找到每行最后一個字符,然后將此字符之前的空白轉換為換行符。

更簡單的例子(在圖像的左上角用黑色和默認字體繪制“Hello world!”):

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

您可以在項目的根目錄中創建一個目錄“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)

首先,您必須下載字體類型...例如: 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')

使用 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 對象。 然后我們在保存圖像之前向圖像添加一個矩形和一些文本。

其他答案中沒有提到的一件事是檢查文本大小。 通常需要確保文本適合圖像(例如,如果過大則縮短文本)或確定繪制文本的位置(例如對齊文本頂部中心)。 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)) 

首先安裝枕頭

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)

我最近不得不實施同樣的事情。 我在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 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')

這將是結果:

在此處輸入圖片說明

要在圖像文件上添加文本,只需復制/粘貼下面的代碼

<?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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM