음.... 추석날 파이선을 어떻게 하면서 만들어 본것.. orz

 

captcha.py

 

 

 

#!/usr/bin/python

import Image
import ImageDraw
import ImageFont
import ImageFilter
import ImageOps
import random

import sys
import string
from optparse import OptionParser
global ext
ext = ".jpg"

makeCnt = int(sys.argv[1])
 
def gen_captcha_img(strText):
 width = 280
 height = 100
 #Create the image
 im = Image.new("RGB", (width, height), "black")

 fontFile = "/usr/share/fonts/dejavu/DejaVuSans.ttf"
 rand = random.randint
 #Set the font and its size
 font = ImageFont.truetype(fontFile, 50)

 #Get image size
 x, y = im.size

 #Create an object that can be used to draw in the given image
 draw = ImageDraw.Draw(im)

 #Draw the text
 #fontColor = (rand(0,255), rand(0,255), rand(0,255))
 fontColor = "#fff"
 draw.text((35,25), strText, font=font, fill=fontColor)

 for i in range(15):
  draw.line((rand(0,x),rand(0,y), rand(0,x),rand(0,y)), fill=(rand(0,255), rand(0,255), rand(0,255)))

#   pxColor = "#fff"
 pxColor = (rand(0,255), rand(0,255), rand(0,255))
#   color += str(hex(rand(0,4095)))[2:5]
 #Draw points (individual pixels) inside the image area
 for i in range(300):
  draw.point((rand(0,x),rand(0,y),rand(0,x),rand(0,y)), fill=pxColor)

 #Apply a filter to the image
 im = im.filter(ImageFilter.BLUR)
 im = im.filter(ImageFilter.EDGE_ENHANCE_MORE)

 im.rotate(rand(0,90)-45).save(strText + ext)
#   im.save(strText + ext)


def gen_random_captcha(makeCnt):
 gen_tx = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()"
 textRand = random.randint
 textLen = 6
 for i in range(makeCnt):
  text = ""
  for j in range(textLen):
   text += gen_tx[textRand(0, len(gen_tx)-1)]

  gen_captcha_img(text)

gen_random_captcha(makeCnt)
print "made a captcha\n"

'리눅스 서버에 대해서 > python' 카테고리의 다른 글

파이선 간단한 captchr 소스  (0) 2013.09.20
파이선 PIL 간단 예제  (0) 2013.09.20
파이썬의 PIL 이미지 라이브러리 사용 강좌  (0) 2013.09.18
captcha 우회하기  (0) 2013.09.18
CAPTCHA 만들기  (0) 2013.05.15

http://www.emoticode.net/python/create-an-image-using-pil-python-imaging-library.html

 

#!/usr/bin/python

import Image
import ImageDraw
import ImageFont
import ImageFilter
import cStringIO
import random

def gen_captcha_img(txt):
	#Create the image
	im = Image.new("RGB", (140,40), "#444")
	#Create an object that can be used to draw in the given image
	draw = ImageDraw.Draw(im)
	#Get image size
	x, y = im.size
	pnt = random.randint
	#Draw points (individual pixels) inside the image area
	for i in range(300):
		draw.point((pnt(0,x),pnt(0,y),pnt(0,x),pnt(0,y)), fill="#666")
	#Set the font and its size
	font = ImageFont.truetype("../font/Cashier.ttf", 30)
	#Draw the text
	draw.text((5,3), txt, font=font, fill="#fff")
	#Apply a filter to the image
	im = im.filter(ImageFilter.EDGE_ENHANCE_MORE)
	#Create a string buffer
	f = cStringIO.StringIO()
	#Save the image in the sting buffer (instead of in a file)
	im.save(f, "JPEG")
	#Get the string buffer content
	content = f.getvalue()
	f.close()
	#Base64 encode for data URI scheme
	data_uri = content.encode("base64").replace("\n", "")
	#Show the image according to data URI scheme
	img = '<img src="https://t1.daumcdn.net/cfile/tistory/2445A23756E6610337" />' % (data_uri)
	print img

	
print "Content-type: text/html\n"
gen_captcha_img("emoticode")

 

 

이걸 응용하면 좋을듯

-- 선언부 --

 

import Image

 

global ext
ext = ".jpg"

 

imageFile = "test.jpeg"
im1 = Image.open(imageFile)

 

 

-- 이미지 조작 --

 

Resize

def imgResize(im):

    div = 2
    width = im.size[0] / div
    height = im.size[1] / div

    im2 = im.resize((width, height), Image.NEAREST) # use nearest neighbour
    im3 = im.resize((width, height), Image.BILINEAR) # linear interpolation in a 2x2 environment
    im4 = im.resize((width, height), Image.BICUBIC) # cubic spline interpolation in a 4x4 environment
    im5 = im.resize((width, height), Image.ANTIALIAS) # best down-sizing filter
    
    im2.save("NEAREST" + ext)
    im3.save("BILINEAR" + ext)
    im4.save("BICUBIC" + ext)
    im5.save("ANTIALIAS" + ext)

imgResize(im1)


Crop

def imgCrop(im):
    
    box = (50, 50, 200, 300)
    region = im.crop(box)
    region.save("CROPPED" + ext)

imgCrop(im1)


Transpose

def imgTranspose(im):
    
    box = (50, 50, 200, 300)
    region = im.crop(box)
    
    region = region.transpose(Image.ROTATE_180)
    im.paste(region, box)
    
    im.save("TRANSPOSE" + ext)

imgTranspose(im1)


Band merge

    
def bandMerge(im):
    
    r, g, b = im.split()
    im = Image.merge("RGB", (g,g,g))
    
    im.save("MERGE" + ext)

bandMerge(im1)


Blur

import ImageFilter

def filterBlur(im):
    
    im1 = im.filter(ImageFilter.BLUR)
    
    im1.save("BLUR" + ext)

filterBlur(im1)


Find contours

    
def filterContour(im):
    
    im1 = im.filter(ImageFilter.CONTOUR)
    
    im1.save("CONTOUR" + ext)

filterContour(im1)


Find edges

def filterFindEdges(im):
    
    im1 = im.filter(ImageFilter.FIND_EDGES)
    
    im1.save("EDGES" + ext)

filterFindEdges(im1)
    

 

 

-- 이미지 만들어서 글자 쓰기 --

 

image = Image.new("RGBA", (600,150), (255,255,255))
draw = ImageDraw.Draw(image)
font = ImageFont.truetype("resources/HelveticaNeueLight.ttf", fontsize)

draw.text((10, 0), txt, (0,0,0), font=font)
img_resized = image.resize((188,45), Image.ANTIALIAS)

 

 

http://en.wikibooks.org/wiki/Python_Imaging_Library/Editing_Pixels

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()

또 무슨 기능??

간단한 captcha 는 기계적으로 풀어버리는 소스.

http://kthan.tistory.com/176

 

음....

 

파이선 말고 php 로는 구글에 이런것도 있음..

http://code.google.com/p/cool-php-captcha/

+ Recent posts