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__