보안 문자 이미지 생성기

우리는 베개 패키지의 도움으로 파이썬을 사용하여 임의의 캡차 이미지를 생성하는 논리를 구축할 것입니다.

For more detailed reference about pillow check this.

이 명령을 사용하여 이 패키지를 설치합니다.

   pip install pillow




새 이미지 만들기



이 코드는 90X60의 흰색 이미지를 생성하고 blank_image.png를 저장합니다.

   from PIL import Image
   img = Image.new('RGB', (90, 60), color = 'white')
   img.save('blank_image.png')


blank_image.png

이미지에 텍스트 그리기



이제 이미지를 만들어 저장했습니다. 텍스트를 추가해 보겠습니다.

   from PIL import Image, ImageDraw
   draw = ImageDraw.Draw(img)
   draw.text((20,20), "Hello", fill=(38, 38, 38))
   img.save('blank_image.png')

Hello는 10X10 지점의 img 객체에 기록됩니다.

선을 그리다



이미지에 선을 그리자

   draw.line((40,30, 150,300), fill=120, width=1)
   draw.line((20,30, 30,20), fill=88, width=2)


채우기는 색상이고 너비 크기를 설정합니다.
(40,30)은 라인 1의 시작점이며 (150,300)에서 끝납니다.
끝점이 이미지 크기보다 큰 것을 알 수 있으며 생략됩니다.

1행과 동일하게 2행은 (20,30)에서 시작하여 (30,20)에서 끝납니다.

그리기 포인트



더 많은 것을 추가하자
이미지에 점 그리기

   draw.point(((30, 40), (10, 20), (14, 25), (35, 10), (14, 28), (17, 25)), fill="black")


이것은 주어진 XY 좌표에서 이미지의 도트 포인트를 던집니다.

캡차 문자열 생성



동일한 논리가 Url Shortener에서 사용되며 여기에서 확인할 수 있습니다.



random_string 함수는 길이가 5인 임의의 문자열을 생성하며 이를 조정할 수 있습니다.

import string, random 

# generate thr random captcha string
def random_string():
    # hash length
    N = 5
    s = string.ascii_uppercase + string.ascii_lowercase + string.digits
    # generate a random string of length 5
    random_string = ''.join(random.choices(s, k=N))
    return random_string


파이썬 람다 함수



람다는 무엇입니까?
한 줄과 하나의 표현식이 있는 특수 함수입니다. 여러 인수를 얻을 수 있습니다.

# Normal funtion
def square(a):
    return a*a

square(5) ---> 25

# lambda funtion
square = lambda a: a*a
square(5) ---> 25


이미지에서 임의의 위치를 ​​가져오는 람다 함수

   # lambda function - used to pick a random loaction in image
getit = lambda : (random.randrange(5, 85),random.randrange(5, 55))


이것은 5와 84 ​​사이의 임의의 값을 무시할 것입니다.
참고: 85개는 사용하지 않음

   random.randrange(5, 85)


무작위로 선택되는 색상 값

   # pick a random colors for points
   colors = ["black","red","blue","green",(64, 107, 76),(0, 87, 128),(0, 3, 82)]
   fill_color = [120,145,130,89,58,50,75,86,98,176,]
   # pick a random colors for lines
   fill_color = [(64, 107, 76),(0, 87, 128),(0, 3, 82),(191, 0, 255),(72, 189, 0),(189, 107, 0),(189, 41, 0)]


목록에서 임의의 값을 얻으려면 임의의 색상 값을 얻습니다.

   random.choice(colors)


captcha 이미지를 생성하는 전체 로직




from PIL import Image, ImageDraw, ImageFont
import string, random 

# generate thr random captcha string
def random_string():
    # hash length
    N = 5
    s = string.ascii_uppercase + string.ascii_lowercase + string.digits
    # generate a random string of length 5
    random_string = ''.join(random.choices(s, k=N))
    return random_string

# lambda function - used to pick a random loaction in image
getit = lambda : (random.randrange(5, 85),random.randrange(5, 55))

# pick a random colors for points
colors = ["black","red","blue","green",(64, 107, 76),(0, 87, 128),(0, 3, 82)]

# fill_color = [120,145,130,89,58,50,75,86,98,176,]
# pick a random colors for lines
fill_color = [(64, 107, 76),(0, 87, 128),(0, 3, 82),(191, 0, 255),(72, 189, 0),(189, 107, 0),(189, 41, 0)]

# generate thr random captcha string
def random_string():
    # hash length
    N = 5
    s = string.ascii_uppercase + string.ascii_lowercase + string.digits
    # generate a random string of length 5
    random_string = ''.join(random.choices(s, k=N))
    return random_string

# generate the captcha image
def gen_captcha_img():
    # create a img object
    img = Image.new('RGB', (90, 60), color="white")
    draw = ImageDraw.Draw(img)

    # get the random string
    captcha_str = random_string()
    # get the text color
    text_colors = random.choice(colors)
    font_name = "fonts/SansitaSwashed-VariableFont_wght.ttf"
    font = ImageFont.truetype(font_name, 18)
    draw.text((20,20), captcha_str, fill=text_colors, font=font)

    # draw some random lines
    for i in range(5,random.randrange(6, 10)):
        draw.line((getit(), getit()), fill=random.choice(fill_color), width=random.randrange(1,3))

    # draw some random points
    for i in range(10,random.randrange(11, 20)):
        draw.point((getit(), getit(), getit(), getit(), getit(), getit(), getit(), getit(), getit(), getit()), fill=random.choice(colors))

    # save image in captcha_img directory
    img.save("captcha_img/"+ captcha_str +".png")

    return True




                          **WE MADE IT** 🥳🥳🥳



각각의 새 이미지에서 선과 점을 임의로 지정하는 데 사용되는 코드for i in range(5,random.randrange(6, 10)):를 확인할 수 있습니다.
여기에 사용된 글꼴은 google fonts입니다.
https://fonts.google.com/specimen/Sansita+Swashed

참고: 문자열의 값(백엔드)을 확인하려면 문자열을 세션에 저장하거나 고유한 방식을 사용할 수 있습니다.
더 자세한 이미지를 생성하려면 모양이 다른 작은 이미지를 사용하고 무작위로 던집니다.

더 많은 기사











감사합니다. 좋은 하루 되세요.🤪😎

좋은 웹페이지 즐겨찾기