PIL 설치...

http://itekblog.com/centos-6-x-install-pil-python-imaging-library-tutorial/

 

 

yum install python-imaging

 

 

이후 강좌

http://kylog.tistory.com/17

윈도우용 파이썬 같은 느낌이긴 한데;;;

 

http://code.google.com/p/gonando-project/wiki/HowToUsePIL

Introduction

PIL 라이브러리를 가지고 이미지 관리 프로그램의 기능들을 어떻게 프로그래밍해야하는지 정리합니다.

참고 문서

기본 기능

크기 변환

resize 메소드 이용

  • im.resize(size) => image
  • im.resize(size, filter) => image
  • 크기를 바꾼 이미지 객체를 리턴한다.
  • size에는 픽셀단위로 터플에 담아서 넣는다. (width, height)
  • filter에는 NEAREAST, BILINEAR, BICUBIC, ANTIALTIAS 중 하나를 지정한다.
    • NEAREAST: 조사중
    • BILINEAR:
    • BICUBIC:
    • ANTIALTIAS:
  • 필터인자 값이 생략되거나 이미지가 모드 1이나 모드 P라면 NEAREST로 지정된다.

 

예제코드 )

>>> im.resize((200,300))

<PIL.Image.Image image mode=RGB size=200x300 at 0x27DFCB0>

>>> im.resize((200,300)).show()

포맷 변환

save 메소드 이용

  • im.save(outfile, options...)
  • im.save(outfile, format, options...)
  • outfile에 넣은 문자열을 파일 이름으로 하여 저장한다.
  • format을 생략한 경우 format은 파일이름의 확장자로 설정된다.
  • 이 메소드는 None을 리턴
  • option은 추가적인 지시를 제공한다.
  • option을 인식하지 못할 경우 조용히 무시된다
  • 가능한 옵션들은 필요하다면 추가 조사
  • 파일 이름 대신 객체를 넣을 수 있다는데 이에 대한 내용도 추가조사
  • 저장에 실패할 경우 그 이유를 예외로 띄워준다 .
  • 주로 IOError 예외가 발생하는데 이 경우 파일을 만들고 데이터를 이미 넣었을 지도 모른다. 이 불완전한 파일을 제거하는것이 필요하다면 그것은 당신의 몫!

 

예제코드 )

>>> print im.save("tail.bmp","bmp")

None

>>> im.save("tail.bmp")

하나의 픽셀의 값 읽기/설정

픽셀 값 읽기

getpixel 메소드 이용

  • im.getpixel(xy) => value or tuple
  • 매개변수로 두 좌표를 담은 터플(x,y)를 넣어주어야 한다.
  • 다중레이어 이미지라면 각 레이어의 해당 픽셀을 터플에 담아 반환한다.
  • 보다 빠르게 수행하려면 픽셀접근object(load)를 이용하거나 getdata메소드를 이용하는것이 좋다.

 

예제코드 )

>>> from PIL import Image

>>> im = Image.open("c:\\py_t\\2.jpg")

>>> im.getpixel((1,2))

(33, 180, 187)

픽셀 값 설정

putpixel 메소드 이용

  • im.putpixel(xy, colour)
  • 단일 밴드인 경우 colour에 숫자를, 멀티밴드인 경우 coulour에 터플로 숫자를 담아서 주어야 한다.
    • 밴드가 뭘까? => 레이어랑 비슷한 개념인것같은데, 그 차이점을 추가조사해보겠습니다.

예제코드 )

 

>>> im.putpixel((1,2),33)

>>> im.getpixel((1,2))

(33, 0, 0)

미러링

  • FLIP_LEFT_RIGHT를 인자값으로 넣으면 수직선에 대해 대칭시킨 이미지를 리턴한다.
  • FLIP_TOP_BOTTOM은 소평선에 대해 대칭시킨 이미지를 리턴한다.

예제코드 )

>>> im.transpose(Image.FLIP_LEFT_RIGHT).show()

>>> im.transpose(Image.FLIP_TOP_BOTT)M).show()

일부 영역 선택/복사

crop 메소드 사용.(직사각형 선택 및 복사)

  • im.crop(box)
  • box 인자로 네개의 원소를 가진 터플이 들어간다.
  • ( left, upper, right, lower)
  • 직사각형의 왼쪽, 위쪽, 오른쪽, 아래쪽의 픽셀좌표를 의미
  • 잘라낸 영역의 복사본을 리턴한다. (원본에 손상없음)

예제코드 )

>>> im.crop((10,0,100,100)).show()

alpha 값 변환(투명도)

이미지를 투명하게 만들 수 있다.

putalpha

  • im.putalpha(band)

 

회전

rotate 메소드 이용

  • im.rotate(angle) => image
  • im.rotate(angle, filter=NEAREST, expand=0) => image
  • 주어진 각도만큼 시계방향으로 회전한 이미지의 복사본을 리턴한다
  • 필터 인자는 NEAREST, BILINEAR, BICUBIC 중 하나가 될 수 있다.
  • 생략 된 경우나 이미지의 모드가 1이나 P인 경우 NEAREST로 지정한다.
  • 확장인자 expand가 true로 들어오면 리턴하는 이미지가 회전이미지를 포함할 만큼 크게 조절해준다. 그러나 생략된 경우나 false인 경우 리턴된 이미지는 입력이미지와 같은 크기를 유지한다.
  • 오버로딩 관계에 있는 인자하나인 메소드는 이미지크기를 조절해서 회전이미지를 포함한다.

 

예제코드 )

>>> im.rotate(90).show()

"""이 경우 회전이미지를 포함한다. """

>>> im.rotate(45,0).show()

"""이 경우는 회전이미지를 포함하지 못하고 부분적으로 약간 짤리게 된다 """

!!NEAREST 등의 상수가 정의되지 않은 같다. 어떤 모듈을 임포트해야할지 모르겠다..;

이미지에 텍스트 쓰기

ImageDraw 모듈의 text 메소드 이용

  • import ImageDraw
  • draw = ImageDraw.Draw(im)
  • 여기서 im은 위에서 사용하였던 Image.open의 결과
  • draw.text(position, string, options)
  • 주어진 좌표에 문자열을 삽입한다. 좌표는 텍스트의 왼쪽 위를 가리킨다.
  • 폰트옵션으로 사용하고자 하는 폰트를 설정한다.
  • 복사본에 효과를 적용하여 리턴하는 것이 아니라 바로 대상 객체에 적용한다.

 

예제코드 )

>>> import ImageDraw

>>> draw = ImageDraw.Draw(im)

>>> draw.text((44,55),"YES WE CAN DO IT! ")

>>> im.show()

폰트의 종류, 크기와 색상을 지정하고 싶은 경우

예제코드 )

import ImageFont, ImageDraw

draw
= ImageDraw.Draw(image)

use a truetype font
font
= ImageFont.truetype("arial.ttf", 15)

draw
.text((10, 25), "world", (0,0,0),font)
  • PIL에서는 비트맵폰트와 트루타입폰트를 다룰 수 있는데 비트맵폰트는 크기를
  • 지정할수 없으므로 적지않음.
  • 트루타입 폰트 : 글자의 외곽선만을 저장한 폰트타입.
  • font = ImageFont.truetype("arial.ttf", 15)
  • truetype메소드를 통해 폰트의 종류와 폰트크기를 지정하여 폰트객체를 생성.
  • draw.text((10, 25), "world", (0,0,0),font)
  • 세번째 인자로 rgb색상값을 넣고 네번째 인자로 위에서 지정한 폰트를 넣는다.

썸네일생성

thumbnail 메소드 이용

  • im.thumbnail(size)
  • im.thumbnail(size, filter)
  • 내부적으로 draft메소드가 이용되는것 같다.
  • 필터 인자로는 NEAREST, BILINEAR, BICUBIC, ANTIALIAS 중 하나가 가능하다.
  • 생략된 경우 NEAREST로 설정된다
  • 필터 인자는 중 하나가 될수있다
  • 이미지 object를 바로 수정하기때문에 원본자료를 또 이용할 일이 있는 경우 원본의 복사본을 이용하는 것이 좋다.
  • None을 리턴한다.

 

예제코드 )

>>> print im.thumbnail((200,300))

None

>>> im.show()

또 무슨 기능??

+ Recent posts