1: package Image::Filter::Blur;
   2: #Oki, so I cheated a bit by using Inline::C instead :)
   3: #Anyway, I owe alot to the fine folks on inline@perl.org and several monks here (derby, rob_au, zaxo)
   4: #I have some other filter code lying around
   5: #I plan to release this stuff to CPAN at some point, might change name tho
   6: #This is ofcourse a draft, cleaner subs etc should be added later on
   7: #call it :
   8: #use Filter::Image::Blur;
   9: #blur("inputpic.jpg","outputpic.jpg");
  10: #Using PNG takes a little tweaking :)
  11: #Anyway, enjoy :)
  12: #Note: This is a BW based blur
  13: use 5.006;
  14: use strict;
  15: use vars qw($VERSION @ISA @EXPORT);
  16: use Exporter;
  17: 
  18: @EXPORT = qw(blur);
  19: 
  20: $VERSION = '0.01';
  21: 
  22: use Inline C => Config => LIBS => '-lgd -ljpeg',
  23: 			  AUTO_INCLUDE  => '#include "gd.h"';
  24: use Inline C =><<EOC;
  25: 
  26: int blur(char* infile, char* outfile)
  27: { gdImagePtr im;
  28:   gdImagePtr imblur;
  29:   FILE *in, *out;
  30:   int dimx = 0;
  31:   int dimy = 0;
  32:   int w = 0;
  33:   int h = 0;
  34:   int index = 0;
  35:   
  36:   in = fopen(infile, "rb");
  37:   im = gdImageCreateFromJpeg(in);
  38:   fclose(in);
  39:   dimx = gdImageSX(im);
  40:   dimy = gdImageSY(im);
  41:   imblur = gdImageCreate(dimx,dimy);
  42:   for (w = 0; w < dimx ; w++)
  43:   { for (h = 0; h < dimy ; h++)
  44:     { float newfcolor = (  
  45:       gdImageRed(im,gdImageGetPixel(im,w-1,h-1))+
  46:       gdImageRed(im,gdImageGetPixel(im,w-1,h))+
  47:       gdImageRed(im,gdImageGetPixel(im,w-1,h+1))+
  48:       gdImageRed(im,gdImageGetPixel(im,w,h-1))+
  49:       gdImageRed(im,gdImageGetPixel(im,w,h))+
  50:       gdImageRed(im,gdImageGetPixel(im,w,h+1))+
  51:       gdImageRed(im,gdImageGetPixel(im,w+1,h-1))+
  52:       gdImageRed(im,gdImageGetPixel(im,w+1,h))+
  53:       gdImageRed(im,gdImageGetPixel(im,w+1,h+1)) )/9;
  54:       int newcolor = (int) newfcolor;
  55:       newcolor = newcolor > 255 ? 255 : (newcolor < 0 ? 0 : newcolor);
  56:       index = gdImageColorExact(imblur,newcolor,newcolor,newcolor);
  57:       if (index == -1) { index = gdImageColorAllocate(imblur,newcolor,newcolor,newcolor); }
  58:       gdImageSetPixel(imblur,w,h,index);
  59:     }
  60:   }
  61: 
  62:   out = fopen(outfile, "wb");
  63:   gdImageJpeg(imblur, out,-1);
  64:   fclose(out);
  65:   gdImageDestroy(im);
  66:   gdImageDestroy(imblur);
  67:   return 1;
  68: }
  69: EOC
  70: 
  71: 1;
  72: __END__