PIL을 사용하여 이미지에 텍스트 추가
이미지를 로드하는 응용 프로그램이 있는데 사용자가 이미지를 클릭하면 이 이미지에 대한 텍스트 영역이 나타납니다(사용).jquery
), 여기서 사용자는 이미지에 일부 텍스트를 쓸 수 있습니다.이미지에 추가해야 합니다.
그것에 대해 조사를 한 후, 저는 그것이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
.
텍스트 래핑(다중 줄 바꿈)을 추가하려면 한 줄에 몇 개의 문자가 들어올 수 있는지 대략적으로 파악하면 텍스트에 대한 사전 처리 기능을 작성할 수 있습니다. 그러면 기본적으로 각 줄에서 마지막 문자를 찾고 이 문자 앞의 공백을 새 줄로 변환할 수 있습니다.
더 최소한의 예제(이미지 왼쪽 상단에 기본 글꼴로 "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)
최초 설치 베개
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)
먼저 글꼴 유형을 다운로드해야 합니다.예: 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/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))
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')
새() 메서드를 사용하여 이미지 개체를 만듭니다.로드된 이미지가 없는 이미지 개체를 반환합니다.그런 다음 이미지를 저장하기 전에 이미지에 직사각형과 일부 텍스트를 추가합니다.
저는 최근에 같은 것을 구현해야 했습니다.나는 유용할 수 있는 pypi 패키지를 만들었습니다: pinter.
다음 단계를 수행하여 이미지에 텍스트를 추가할 수 있습니다.
:
curl https://i.imgur.com/XQCKcC9.jpg -o ./image.jpg
글꼴다로드:
curl https://fonts.google.com/download?family=Roboto -o ./roboto.zip ; unzip ./roboto.zip -d ./Roboto
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')
결과는 다음과 같습니다.
베개나 PIL 모듈을 사용하여 파이썬으로 할 수 있습니다.방법 알아보기
이미지 파일에 텍스트를 추가하려면 아래 코드를 복사/붙여넣기만 하면 됩니다.
<?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
'programing' 카테고리의 다른 글
StackOverflowError(스택오버플로 오류)로 인해 웹 응용 프로그램 [/app]에 대한 주석 검색을 완료할 수 없습니다. (0) | 2023.07.24 |
---|---|
MariaDB: 내부 쿼리 결과에 PK 사용 (0) | 2023.07.24 |
Python SQL 쿼리 문자열 형식 지정 (0) | 2023.07.24 |
코드 점화기 세션이 Ajax 호출로 버그가 발생함 (0) | 2023.07.24 |
String(값) 대 value.to String()의 차이점은 무엇입니까? (0) | 2023.07.24 |