PIL을 사용하여 이미지에 텍스트 추가
이미지를로드하는 응용 프로그램이 있는데 사용자가 이미지를 클릭하면이 이미지에 대한 텍스트 영역 (사용 jquery
) 이 나타나서 사용자가 이미지에 텍스트를 쓸 수 있습니다. Image에 추가해야합니다.
이에 대해 조사한 후 PIL
(Python Imaging Library)가이 작업을 수행하는 데 도움이 될 수 있다고 생각했습니다 . 그래서 어떻게 작동하는지보기 위해 몇 가지 예제를 시도했고 이미지에 텍스트를 쓸 수있었습니다. 하지만 Python Shell
웹 환경에서 사용 해보면 약간의 차이가 있다고 생각 합니다. 텍스트 영역의 텍스트는 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. 또한 텍스트 영역은 위치 : 절대 및 고정 크기입니다.
이미지에서 텍스트 영역의 좌표를 얻을 수 있도록 양식 안에 배치해야합니까? 사용자가 클릭하면 이미지에 텍스트를 쓰고 이미지에 저장하고 싶습니다.
에서 사용 가능한 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
.
텍스트 줄 바꿈 (여러 줄)을 추가하려면 한 줄에 몇 개의 문자가 올 수 있는지 대략적으로 생각한 다음 텍스트에 대한 사전 처리 기능을 작성할 수 있습니다.이 함수는 기본적으로 각 줄에서 마지막 문자를 찾고 이 문자 앞의 공백을 개행으로 변환합니다.
프로젝트의 루트에 "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)
더 간단한 예제 ( "Hello world!"를 검정색으로 그리고 이미지의 왼쪽 상단에 기본 글꼴로 그립니다) :
...
from PIL import ImageDraw
...
ImageDraw.Draw(
image # Image
).text(
(0, 0), # Coordinates
'Hello world!', # Text
(0, 0, 0) # Color
)
먼저 글꼴 유형을 다운로드해야합니다 ... 예 : 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')
With Pillow, you can also draw on an image using the ImageDraw module. You can draw lines, points, ellipses, rectangles, arcs, bitmaps, chords, pieslices, polygons, shapes and text.
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')
we create an Image object with the new() method. This returns an Image object with no loaded image. We then add a rectangle and some text to the image before saving it.
One thing not mentioned in other answers is checking the text size. It is often needed to make sure the text fits the image (e.g. shorten the text if oversized) or to determine location to draw the text (e.g. aligned text top center). Pillow/PIL offers two methods to check the text size, one via ImageFont and one via ImageDraw. As shown below, the font doesn't handle multiple lined, while ImageDraw does.
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))
To add text on an image file, just copy/paste the code below
<?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>
참고URL : https://stackoverflow.com/questions/16373425/add-text-on-image-using-pil
'developer tip' 카테고리의 다른 글
모든 열거 형에 StringEnumConverter를 적용하도록 Json.Net에 전역 적으로 알리는 방법 (0) | 2020.10.07 |
---|---|
누수 추상화의 의미? (0) | 2020.10.07 |
VB.NET에서 클래스를 정적으로 표시 (0) | 2020.10.07 |
언제 힙을 사용하고 싶습니까? (0) | 2020.10.07 |
.NET DLL에 git 커밋 해시 포함 (0) | 2020.10.07 |