source: pwntcha/trunk/src/clubic.c @ 1000

Last change on this file since 1000 was 482, checked in by Sam Hocevar, 15 years ago
  • filter_equalize -> filter_threshold
  • Property svn:keywords set to Id
File size: 3.4 KB
Line 
1/*
2 * clubic.c: decode clubic captchas
3 * $Id: clubic.c 482 2005-05-30 15:22:02Z sam $
4 *
5 * Copyright: (c) 2005 Sam Hocevar <sam@zoy.org>
6 *   This program is free software; you can redistribute it and/or
7 *   modify it under the terms of the Do What The Fuck You Want To
8 *   Public License as published by Banlu Kemiyatorn. See
9 *   http://sam.zoy.org/projects/COPYING.WTFPL for more details.
10 */
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15#include <limits.h>
16
17#include "config.h"
18#include "common.h"
19
20static void find_glyphs(struct image *img);
21
22/* Our macros */
23char *result;
24
25/* Main function */
26char *decode_clubic(struct image *img)
27{
28    struct image *tmp;
29
30    /* clubic captchas have 6 characters */
31    result = malloc(7 * sizeof(char));
32    strcpy(result, "      ");
33
34    tmp = image_dup(img);
35    filter_threshold(tmp, 200);
36    find_glyphs(tmp);
37
38    image_free(tmp);
39
40    return result;
41}
42
43static void find_glyphs(struct image *img)
44{
45    static struct font *font = NULL;
46    struct image *tmp;
47    int x, y, i = 0;
48    int r, g, b;
49    int xmin, xmax, ymin, ymax, startx = 0, cur = 0;
50    int distmin, distx, disty, distch;
51
52    if(!font)
53    {
54        font = font_load_variable("font_clubic.png", "0123456789");
55        if(!font)
56            exit(1);
57    }
58
59    tmp = image_new(img->width, img->height);
60
61    for(y = 0; y < img->height; y++)
62        for(x = 0; x < img->width; x++)
63        {
64            getpixel(img, x, y, &r, &g, &b);
65            setpixel(tmp, x, y, 255, g, 255);
66        }
67
68    while(cur < 6)
69    {
70        /* Try to find 1st letter */
71        distmin = INT_MAX;
72        for(i = 0; i < font->size; i++)
73        {
74            int localmin = INT_MAX, localx, localy;
75            xmin = font->glyphs[i].xmin;
76            ymin = font->glyphs[i].ymin;
77            xmax = font->glyphs[i].xmax;
78            ymax = font->glyphs[i].ymax;
79            for(y = -4; y < 4; y++)
80                for(x = startx; x < startx + 4; x++)
81                {
82                    int z, t, dist;
83                    dist = 0;
84                    for(t = 0; t < ymax - ymin; t++)
85                        for(z = 0; z < xmax - xmin; z++)
86                        {
87                            int r2;
88                            getgray(font->img, xmin + z, ymin + t, &r);
89                            getgray(img, x + z, y + t, &r2);
90                            dist += abs(r - r2);
91                        }
92                    dist = dist * 128 / font->glyphs[i].count;
93                    if(dist < localmin)
94                    {
95                        localmin = dist;
96                        localx = x;
97                        localy = y;
98                    }
99                }
100            if(localmin < distmin)
101            {
102                distmin = localmin;
103                distx = localx;
104                disty = localy;
105                distch = i;
106            }
107        }
108
109        /* Print min glyph */
110        xmin = font->glyphs[distch].xmin;
111        ymin = font->glyphs[distch].ymin;
112        xmax = font->glyphs[distch].xmax;
113        ymax = font->glyphs[distch].ymax;
114        for(y = 0; y < ymax - ymin; y++)
115            for(x = 0; x < xmax - xmin; x++)
116            {
117                getpixel(font->img, xmin + x, ymin + y, &r, &g, &b);
118                if(r > 128)
119                    continue;
120                setpixel(tmp, distx + x, disty + y, r, g, b);
121            }
122
123        startx = distx + xmax - xmin;
124        result[cur++] = font->glyphs[distch].c;
125    }
126
127    image_free(tmp);
128}
129
Note: See TracBrowser for help on using the repository browser.