72 lines
2.0 KiB
Python
72 lines
2.0 KiB
Python
import os.path
|
|
import random
|
|
|
|
from rest_captcha.settings import api_settings as settings
|
|
from django.conf import settings as django_setting
|
|
from django.core.cache import caches
|
|
from rest_captcha import captcha
|
|
from PIL import ImageFont, ImageDraw, Image
|
|
from io import BytesIO as StringIO
|
|
|
|
cache = caches[settings.CAPTCHA_CACHE]
|
|
|
|
path = os.path.dirname(__file__) + '/' # noqa
|
|
|
|
|
|
def random_char_challenge(length):
|
|
chars = '123456789'
|
|
ret = ''
|
|
for i in range(length):
|
|
ret += random.choice(chars)
|
|
return ret.upper()
|
|
|
|
|
|
def generate_image(word):
|
|
font = ImageFont.load_default()
|
|
size = settings.CAPTCHA_IMAGE_SIZE
|
|
|
|
xpos = 2
|
|
from_top = 4
|
|
|
|
image = captcha.makeimg(size)
|
|
|
|
for char in word:
|
|
fgimage = Image.new('RGB', size, settings.CAPTCHA_FOREGROUND_COLOR)
|
|
charimage = Image.new('L', captcha.getsize(font, ' %s ' % char), '#000000')
|
|
chardraw = ImageDraw.Draw(charimage)
|
|
chardraw.text((0, 0), char, font=font, fill='#ffffff')
|
|
|
|
charimage = charimage.crop(charimage.getbbox())
|
|
maskimage = Image.new('L', size)
|
|
|
|
xpos2 = xpos + charimage.size[0]
|
|
from_top2 = from_top + charimage.size[1]
|
|
maskimage.paste(charimage, (xpos, from_top, xpos2, from_top2))
|
|
size = maskimage.size
|
|
image = Image.composite(fgimage, image, maskimage)
|
|
xpos = xpos + 2 + charimage.size[0]
|
|
|
|
if settings.CAPTCHA_IMAGE_SIZE:
|
|
# centering captcha on the image
|
|
tmpimg = captcha.makeimg(size)
|
|
xpos2 = int((size[0] - xpos) / 2)
|
|
from_top2 = int((size[1] - charimage.size[1]) / 2 - from_top)
|
|
tmpimg.paste(image, (xpos2, from_top2))
|
|
image = tmpimg.crop((0, 0, size[0], size[1]))
|
|
else:
|
|
image = image.crop((0, 0, xpos + 1, size[1]))
|
|
|
|
draw = ImageDraw.Draw(image)
|
|
|
|
# settings.FILTER_FUNCTION(image)
|
|
settings.NOISE_FUNCTION(image, draw)
|
|
|
|
out = StringIO()
|
|
image.save(out, 'PNG')
|
|
# image.save('ss.png', 'PNG')
|
|
content = out.getvalue()
|
|
out.seek(0)
|
|
out.close()
|
|
|
|
return content
|