728x90

 


Introduce

종종 이미지를 작업이 필요한 경우가 있는데, PIL Library를 활용하면 손쉽게 대응이 가능합니다. 

PIL 이미지 작업 하는 방법에 대해서 간단히 소개합니다. 

 

PIL 이미징 라이브러리는 Python에서 다음과 같은 이미지 처리 기능 제공합니다. 

  • 픽셀 단위의 조작
  • 마스킹 및 투명도 제어
  • 흐림, 윤곽 보정 다듬어 윤곽 검출 등의 이미지 필터
  • 선명하게, 밝기 보정, 명암 보정, 색 보정 등의 화상 조정
  • 이미지에 텍스트 추가
  • 기타 여러가지

다음 코드는 Google Colab Notebook기준으로 작성되었습니다. 

 

Index of Contents

더보기
  • Step1) Install Pillow Library & Import
  • Step2) Load an Image
  • Step3) Load a Font
  • Step4) Render the Text
  • Step5) Export the Result

 

Adding Text on Image using Pillow 

Step1) Install Pillow Library & Import

 

pip install pillow

PIL Package 에서 이번 예제에서 사용할 Image, ImageFont, ImageDraw 모듈을 임포트합니다.

from PIL import Image, ImageFont, ImageDraw

 

Step2) Load an Image

Unsplash, 사이트에 방문하면 무료 이미지를 다운로드하고 Colab 노트북에 업로드합니다. 

https://unsplash.com/photos/LZVmvKlchM0

"/content/image/sophie-turner-unsplash.jpg" 경로에 위치한 파일을 업로드하였습니다. 

이미지 파일을 로드하여 이미지 객체(target_img)를 생성합니다. 

target_img = Image.open("/content/image/sophie-turner-unsplash.jpg")

<주피터 노트북 / Google Colab에서 이미지 표시방법>

# Display image on Jupyter Notebook
from IPython.display import Image as ipy_im
display(target_img)

Step3) Load a Font

시스템 폰트를 로드합니다.

예제에서는 Google Colab의 시스템 폰트인 "LiberationSans-Regular.ttf"를 로드하였습니다. 

def loadfont(fontsize=50):
	# ttf파일의 경로를 지정합니다.
	ttf = '/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf'
	return ImageFont.truetype(font=ttf, size=fontsize)
    #size : in pixels

titlefontObj = loadfont(fontSize=200)

 

  • ImageFont.truetype() Arguments
    • font : 글꼴 리소스 파일(*.ttf)를 지정한다.
    • size : 픽셀 단위의 글꼴 크기를  지정한다.
더보기

PIL.ImageFont.truetype(font=None, size=10, index=0, encoding='', layout_engine=None)

 

Load a TrueType or OpenType font from a file or file-like object, and create a font object. This function loads a font object from the given file or file-like object, and creates a font object for a font of the given size.

Pillow uses FreeType to open font files. If you are opening many fonts simultaneously on Windows, be aware that Windows limits the number of files that can be open in C at once to 512. If you approach that limit, an OSError may be thrown, reporting that FreeType “cannot open resource”.

This function requires the _imagingft service.

 

Parameters

  • font – A filename or file-like object containing a TrueType font. If the file is not found in this filename, the loader may also search in other directories, such as the fonts/ directory on Windows or /Library/Fonts/, /System/Library/Fonts/ and ~/Library/Fonts/ on macOS.
  • size – The requested size, in pixels.
  • index – Which font face to load (default is first available face).
  • encoding 
    • ”unic” (Unicode)
    • ”symb” (Microsoft Symbol)
    • ”ADOB” (Adobe Standard)
    • ”ADBE” (Adobe Expert)
    • ”ADBC” (Adobe Custom)
    • ”armn” (Apple Roman)
    • ”sjis” (Shift JIS)
    • ”gb ” (PRC)
    • ”big5”
    • ”wans” (Extended Wansung)
    • ”joha” (Johab)
    • ”lat1” (Latin-1)
    This specifies the character set to use. It does not alter the encoding of any text provided in subsequent operations.
  • Which font encoding to use (default is Unicode). Possible encodings include (see the FreeType documentation for more information):
  • layout_engine –You can check support for Raqm layout using PIL.features.check_feature() with feature="raqm".
  • New in version 4.2.0.
  • Which layout engine to use, if available: ImageFont.Layout.BASIC or ImageFont.Layout.RAQM.

Returns

A font object.

 

Raises

OSError – If the file could not be read.

 

Source : https://pillow.readthedocs.io/en/stable/reference/ImageFont.html

 

Step4) Render the Text

로드한 이미지 상단에 "The Beauty of Mountain" 텍스트를 렌더링합니다. 

title_text = "The Beauty of Mountain"
out_img = ImageDraw.Draw(target_img)
out_img.text(xy=(15,15), text=title_text, fill=(237, 230, 211), font=titlefontObj)
  • ImageDraw.Text() Arguments
    • xy : 시작 좌표(Starting Coordinates)로 왼쪽 상단을 (0,0)이 된다. 
    • text : 문자열을 지정한다.
    • fill : RGB 또는 RGBa 형식으로 컬러를 지정한다. 
    • font : ImageFont 모듈로 로드한 font 객체를 지정한다.
더보기

ImageDraw.text(xy, text, fill=None, font=None, anchor=None, spacing=4, align='left', direction=None, features=None, language=None, stroke_width=0, stroke_fill=None, embedded_color=False) 

Draws the string at the given position.

Parameters

  • xy – The anchor coordinates of the text.
  • text – String to be drawn. If it contains any newline characters, the text is passed on to multiline_text().
  • fill – Color to use for the text.
  • font – An ImageFont instance.
  • anchor 

    Note

    This parameter was present in earlier versions of Pillow, but implemented only in version 8.0.0.

  • The text anchor alignment. Determines the relative location of the anchor to the text. The default alignment is top left. See Text anchors for valid values. This parameter is ignored for non-TrueType fonts.
  • spacing – If the text is passed on to multiline_text(), the number of pixels between lines.
  • align – If the text is passed on to multiline_text(), "left", "center" or "right". Determines the relative alignment of lines. Use the anchor parameter to specify the alignment to xy.
  • direction 

    New in version 4.2.0.

  • Direction of the text. It can be "rtl" (right to left), "ltr" (left to right) or "ttb" (top to bottom). Requires libraqm.
  • features 

    New in version 4.2.0.

  • A list of OpenType font features to be used during text layout. This is usually used to turn on optional font features that are not enabled by default, for example "dlig" or "ss01", but can be also used to turn off default font features, for example "-liga" to disable ligatures or "-kern" to disable kerning. To get all supported features, see OpenType docs. Requires libraqm.
  • language 

    New in version 6.0.0.

  • Language of the text. Different languages may use different glyph shapes or ligatures. This parameter tells the font which language the text is in, and to apply the correct substitutions as appropriate, if available. It should be a BCP 47 language code. Requires libraqm.
  • stroke_width 

    New in version 6.2.0.

  • The width of the text stroke.
  • stroke_fill 

    New in version 6.2.0.

  • Color to use for the text stroke. If not given, will default to the fill parameter.
  • embedded_color 

    New in version 8.0.0.

  • Whether to use font embedded color glyphs (COLR, CBDT, SBIX).

https://pillow.readthedocs.io/en/stable/reference/ImageDraw.html#functions

 

Step5) Export the Result

결과 이미지를 파일로 저장합니다.

target_img.save("/content/image/sophie-turner-unsplash_addtext.jpg")

아래와 같이 결과 이미지("/content/image/sophie-turner-unsplash_addtext.jpg" )를 노트북에서 확인할 수 있습니다.

result_img = Image.open("/content/image/sophie-turner-unsplash_addtext.jpg")
display(result_img)

 

<텍스트를 이미지 중앙에 정렬하는 코드>

from PIL import Image, ImageDraw

W, H = (300,200)
msg = "hello"

im = Image.new("RGBA",(W,H),"yellow")
draw = ImageDraw.Draw(im)
w, h = draw.textsize(msg)
draw.text(((W-w)/2,(H-h)/2), msg, fill="black")

im.save("hello.png", "PNG")

 


<참고자료>


 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
반응형