Ignore:
Timestamp:
Jan 4, 2005, 6:06:04 PM (16 years ago)
Author:
Sam Hocevar
Message:
  • fixed a bug in the SDL code: alpha mask should be set to 0.
  • implemented filter_black_stuff to remove black dots.
  • allow threshold to be negative in filter_equalize; in this case, invert colours.
  • implemented filter_crop.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pwntcha/trunk/src/filters.c

    r402 r413  
    121121}
    122122
     123struct image *filter_black_stuff(struct image *img)
     124{
     125    struct image *dst;
     126    int x, y;
     127    int r, ra, rb, g, b;
     128
     129    dst = image_new(img->width, img->height);
     130
     131    /* Remove vertical stuff */
     132    for(y = 0; y < img->height; y++)
     133        for(x = 0; x < img->width; x++)
     134        {
     135            getpixel(img, x, y, &r, &g, &b);
     136            setpixel(dst, x, y, r, g, b);
     137            if(y > 0 && y < img->height - 1)
     138            {
     139                getpixel(img, x, y - 1, &ra, &g, &b);
     140                getpixel(img, x, y + 1, &rb, &g, &b);
     141                if(r < ra && (r - ra) * (r - rb) > 5000)
     142                    setpixel(dst, x, y, ra, ra, ra);
     143            }
     144        }
     145
     146    /* Remove horizontal stuff */
     147    for(y = 0; y < img->height; y++)
     148        for(x = 0; x < img->width; x++)
     149        {
     150            getpixel(img, x, y, &r, &g, &b);
     151            if(x > 0 && x < img->width - 1)
     152            {
     153                getpixel(dst, x - 1, y, &ra, &g, &b);
     154                getpixel(dst, x + 1, y, &rb, &g, &b);
     155                if(r < ra && (r - ra) * (r - rb) > 5000)
     156                    setpixel(dst, x, y, ra, ra, ra);
     157            }
     158        }
     159
     160    return dst;
     161}
     162
    123163struct image *filter_detect_lines(struct image *img)
    124164{
     
    166206    int x, y;
    167207    int r, g, b;
    168 
    169     dst = image_new(img->width, img->height);
    170 
    171     for(y = 0; y < img->height; y++)
    172         for(x = 0; x < img->width; x++)
    173         {
    174             getpixel(img, x, y, &r, &g, &b);
    175             if(r < threshold) r = 0; else r = 255;
    176             setpixel(dst, x, y, r, r, r);
     208    int min = 0, max = 255;
     209
     210    dst = image_new(img->width, img->height);
     211
     212    if(threshold < 0)
     213    {
     214        min = 255;
     215        max = 0;
     216        threshold = -threshold;
     217    }
     218
     219    for(y = 0; y < img->height; y++)
     220        for(x = 0; x < img->width; x++)
     221        {
     222            getpixel(img, x, y, &r, &g, &b);
     223            if(r < threshold)
     224                setpixel(dst, x, y, min, min, min);
     225            else
     226                setpixel(dst, x, y, max, max, max);
    177227        }
    178228
     
    330380}
    331381
     382struct image *filter_crop(struct image *img,
     383                          int xmin, int ymin, int xmax, int ymax)
     384{
     385    struct image *dst;
     386    int x, y;
     387    int r, g, b;
     388
     389    if(xmin < 0)
     390        xmin = 0;
     391    if(ymin < 0)
     392        ymin = 0;
     393    if(xmax >= img->width)
     394        xmax = img->width - 1;
     395    if(ymax >= img->height)
     396        ymax = img->height - 1;
     397
     398    if(xmin >= xmax || ymin >= ymax)
     399        return NULL;
     400
     401    dst = image_new(xmax - xmin, ymax - ymin);
     402
     403    for(y = 0; y < dst->height; y++)
     404        for(x = 0; x < dst->width; x++)
     405        {
     406            getpixel(img, xmin + x, ymin + y, &r, &g, &b);
     407            setpixel(dst, x, y, r, g, b);
     408        }
     409
     410    return dst;
     411}
     412
    332413int filter_count(struct image *img)
    333414{
Note: See TracChangeset for help on using the changeset viewer.