Hi, I want to do a gaussian blur on my image and I found some code online to do this but I am confused with some aspects of this method.
Here is the method:
* createGreenfootImageFromBI() is just a method I have in my class to convert BufferedImage to GrennfootImage
Anyway, my problem is I don't understand what the second and third parameter (filter and filterWidth) are in this method are. I am trying to call this method on my image (which I have as a BufferedImage) but what do I enter for the other two parameters? My image is 800 x 600.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | public static GreenfootImage blur(BufferedImage image, int [] filter, int filterWidth) { if (filter.length % filterWidth != 0 ) { throw new IllegalArgumentException( "filter contains a incomplete row" ); } final int width = image.getWidth(); final int height = image.getHeight(); final int sum = IntStream.of(filter).sum(); int [] input = image.getRGB( 0 , 0 , width, height, null , 0 , width); int [] output = new int [input.length]; final int pixelIndexOffset = width - filterWidth; final int centerOffsetX = filterWidth / 2 ; final int centerOffsetY = filter.length / filterWidth / 2 ; // apply filter for ( int h = height - filter.length / filterWidth + 1 , w = width - filterWidth + 1 , y = 0 ; y < h; y++) { for ( int x = 0 ; x < w; x++) { int r = 0 ; int g = 0 ; int b = 0 ; for ( int filterIndex = 0 , pixelIndex = y * width + x; filterIndex < filter.length; pixelIndex += pixelIndexOffset) { for ( int fx = 0 ; fx < filterWidth; fx++, pixelIndex++, filterIndex++) { int col = input[pixelIndex]; int factor = filter[filterIndex]; // sum up color channels seperately r += ((col >>> 16 ) & 0xFF ) * factor; g += ((col >>> 8 ) & 0xFF ) * factor; b += (col & 0xFF ) * factor; } } r /= sum; g /= sum; b /= sum; // combine channels with full opacity output[x + centerOffsetX + (y + centerOffsetY) * width] = (r << 16 ) | (g << 8 ) | b | 0xFF000000 ; } } BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); result.setRGB( 0 , 0 , width, height, output, 0 , width); return createGreenfootImageFromBI(result); } |