Advertisement
EditorRUS

Sugoi kimochii

Jun 28th, 2017
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.86 KB | None | 0 0
  1. def generate_captcha(text,
  2.                      size,
  3.                      font,
  4.                      **kwargs):
  5.  
  6.     font_size = kwargs.get('font_size', 200)
  7.     max_angle = kwargs.get('max_angle', 10)
  8.     max_horizontal_deviation = kwargs.get('max_horizontal_deviation', 0)
  9.     max_vertical_deviation = kwargs.get('max_vertical_deviation', 0)
  10.     foreground_iterations = kwargs.get('foreground_iterations', 1000)
  11.     background_iterations = kwargs.get('background_iteration', 100)
  12.     foreground_bounds = kwargs.get('foreground_bounds', (0, 200))
  13.     background_bounds = kwargs.get('background_bounds', (180, 255))
  14.     foreground_size_limit = kwargs.get('foreground_size_limit', 30)
  15.     background_size_limit = kwargs.get('background_size_limit', 30)
  16.  
  17.  
  18.     foreground_limit = (-foreground_size_limit, foreground_size_limit)
  19.     background_limit = (-background_size_limit, background_size_limit)
  20.     repeat_func_n_times = lambda func, args, n: tuple(func(*args) for _ in range(n))
  21.     background = Image.new(mode='RGB', size=size, color=(255, 255, 255))
  22.     foreground = Image.new(mode='RGB', size=size, color=(255, 255, 255))
  23.     font_object = ImageFont.truetype(font, size=font_size)
  24.  
  25.     foreground_draw = ImageDraw.Draw(foreground)
  26.     background_draw = ImageDraw.Draw(background)
  27.  
  28.     for i in range(foreground_iterations):
  29.         r1x = randint(0, size[0])
  30.         r1y = randint(0, size[1])
  31.         r2x = r1x + randint(*foreground_limit)
  32.         r2y = r1y + randint(*foreground_limit)
  33.         random_rectangle = (r1x, r1y, r2x, r2y)
  34.         random_color = repeat_func_n_times(randint, foreground_bounds, 3)
  35.         foreground_draw.rectangle(xy=random_rectangle,
  36.                                   outline=random_color,
  37.                                   fill=random_color)
  38.  
  39.     for i in range(background_iterations):
  40.         r1x = randint(0, size[0])
  41.         r1y = randint(0, size[1])
  42.         r2x = r1x + randint(*background_limit)
  43.         r2y = r1y + randint(*background_limit)
  44.         random_rectangle = (r1x, r1y, r2x, r2y)
  45.         random_color = repeat_func_n_times(randint, background_bounds, 3)
  46.         background_draw.rectangle(xy=random_rectangle,
  47.                                   outline=random_color,
  48.                                   fill=random_color)
  49.  
  50.     text_size = foreground_draw.textsize(text, font_object)
  51.     text_images = deque()
  52.     for character in text:
  53.         character_image = Image.new(mode='RGB', size=text_size, color=(0, 0, 0))
  54.         character_draw = ImageDraw.Draw(character_image)
  55.         character_draw.text(xy=(0, 0),
  56.                             text=character,
  57.                             fill=(255, 255, 255),
  58.                             font=font_object)
  59.         character_center = character_draw.textsize(character, font_object)
  60.         character_center = (character_center[0] // 2, character_center[1] // 2)
  61.         character_image = character_image.rotate(randint(-max_angle, max_angle),
  62.                                                  expand=True,
  63.                                                  center=character_center)
  64.         character_image = character_image.crop(character_image.getbbox())
  65.         text_images.append(character_image)
  66.  
  67.     paste_boxes = deque()
  68.     cur_x = 0
  69.     for character_image in text_images:
  70.         paste_boxes.append((cur_x, 0,
  71.                             cur_x+character_image.size[0], character_image.size[1]))
  72.         cur_x += character_image.size[0]
  73.  
  74.     translated_boxes = deque()
  75.     for box in paste_boxes:
  76.         horizontal_deviation = randint(-max_horizontal_deviation, max_horizontal_deviation)
  77.         vertical_deviation = randint(-max_vertical_deviation, max_vertical_deviation)
  78.  
  79.         new_box = (box[0]+horizontal_deviation,
  80.                    box[1]+vertical_deviation,
  81.                    box[2]+horizontal_deviation,
  82.                    box[3]+vertical_deviation)
  83.  
  84.         translated_boxes.append(new_box)
  85.  
  86.     min_x = reduce(lambda r, g: min(r, g[0], g[2]), translated_boxes, 0)
  87.     min_y = reduce(lambda r, g: min(r, g[1], g[3]), translated_boxes, 0)
  88.  
  89.     normalized_boxes = deque()
  90.     for box in translated_boxes:
  91.         new_box = (box[0]-min_x,
  92.                    box[1]-min_y,
  93.                    box[2]-min_x,
  94.                    box[3]-min_y)
  95.         normalized_boxes.append(new_box)
  96.  
  97.     max_x = reduce(lambda r, g: max(r, g[0], g[2]), normalized_boxes, 0)
  98.     max_y = reduce(lambda r, g: max(r, g[1], g[3]), normalized_boxes, 0)
  99.  
  100.     text_image = Image.new(mode='RGB', size=(max_x, max_y), color=(0, 0, 0))
  101.     for box, image in zip(normalized_boxes, text_images):
  102.         text_image.paste(im=image, box=box, mask=image.convert('1'))
  103.  
  104.     text_image = text_image.resize(size)
  105.     colorful_text = ImageChops.multiply(foreground, text_image)
  106.     final_image = ImageChops.composite(colorful_text, background, mask=text_image.convert('1'))
  107.     return final_image
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement