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
회전
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()
또 무슨 기능??