PIL을 사용하여 이미지에 텍스트 추가


94

이미지를로드하는 응용 프로그램이 있는데 사용자가 이미지를 클릭하면이 이미지에 대한 텍스트 영역이 나타나고 (사용 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. 또한 텍스트 영역은 위치 : 절대 및 고정 크기입니다.

이미지에서 텍스트 영역의 좌표를 얻을 수 있도록 양식 안에 배치해야합니까? 사용자가 클릭하면 이미지에 텍스트를 쓰고 이미지에 저장하고 싶습니다.


PIL을 사용하여 이미지에 텍스트를 작성하려는 이유 (PIL이 도움이되는지 잘 모르겠습니다). 슬라이더에서 가장 일반적으로 사용되는 오버레이로 텍스트를 표시하는 것만으로 충분하지 않습니까?
lalit

1
이미지를 저장하려는 프로젝트에 필요합니다. Pil는 ImageDraw를 사용하여 이미지에 텍스트를 그릴 수 있지만 다른 방법이 있는지 모릅니다.
Apostolos 2013 년

사용중인 Python 코드를 제공 할 수 있다면 도움이 될 것입니다.
lalit

아직 django에서 구현되지 않았습니다. 대화식 파이썬 콘솔에서 PIL이 어떻게 작동하는지 보려고했습니다. 먼저 작동하는지 확인한 다음 Django에서 전송하고 싶습니다.
Apostolos

코드에서 $ 기호는 무엇입니까?
Mugen

답변:


173

에서 사용 가능한 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.

텍스트 줄 바꿈 (여러 줄)을 추가하려면 한 줄에 몇 개의 문자가 올 수 있는지 대략적으로 생각한 다음 텍스트에 대한 사전 처리 기능을 작성할 수 있습니다.이 함수는 기본적으로 각 줄에서 마지막 문자를 찾고 이 문자 앞의 공백을 개행으로 변환합니다.


1
그것이 나의 초기 생각입니다. 그렇다면 웹 서버의 특정 폴더에 내 글꼴이 있어야 작업 할 수 있습니까? 텍스트 줄 바꿈? 표준 방법이 있습니까 아니면 구현해야합니까?
Apostolos

웹 서버 어디에서나 글꼴 파일을 유지할 수 있습니다. 제공하는 경로가 올바른지 확인하십시오.
lalit

7
@lalit Windows 컴퓨터에서 코드를 시도했는데 글꼴 오류가 발생했습니다 self.font = core.getfont(file, size, index, encoding) IOError: cannot open resource. 글꼴 파일의 경로를 어떻게 제공 할 수 있습니까?
LWZ

3
@LWZ, 위 코드를 실행하려면 위 코드를 실행중인 현재 디렉토리에 글꼴 파일이 있는지 확인하십시오. 프로그램에서 사용하는 경우 파일의 전체 경로를 지정하십시오 (예 : 'C : \ Windows \ Fonts \ sans-serif.ttf'). 여기서 확인해야 할 다른 것은 파일에 대한 적절한 읽기 권한을 부여하는 것입니다.
lalit

3
font = ImageFont.truetype ( "./ arial.ttf", 30); draw.textsize (msg, font = font);
WeizhongTu

16

프로젝트의 루트에 "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)

15

더 최소한의 예 ( "Hello world!"를 검정색으로 그리고 이미지 왼쪽 상단에 기본 글꼴로 그립니다) :

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

7

먼저 글꼴 유형을 다운로드해야합니다 ... 예 : 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')

5

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 객체를 반환합니다. 그런 다음 이미지를 저장하기 전에 사각형과 일부 텍스트를 이미지에 추가합니다.


3

다른 답변에서 언급되지 않은 한 가지는 텍스트 크기를 확인하는 것입니다. 텍스트가 이미지에 맞는지 확인하거나 (예 : 큰 경우 텍스트 축소) 텍스트를 그릴 위치 (예 : 정렬 된 텍스트 상단 중앙)를 결정해야하는 경우가 많습니다. 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)) 

-9

이미지 파일에 텍스트를 추가하려면 아래 코드를 복사 / 붙여 넣기 만하면됩니다.

<?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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.