圖像中的像素格效果是最常見的圖像特效,可以隐藏或者模糊一些不想被顯示出來的圖像細
節,是常用的圖像處理手段。
像素格效果的算法其實非常的簡單,隻是對圖像進行塊掃描,求出每個像素塊的平均rgb
值,然後指派到塊中的每個像素點,最後輸出處理以後的圖像,而像素塊的掃描有點類似
卷積的處理。具體算法步驟如下:
1. 按照從左到右,自上而下的順序,掃描每個像素點。
2. 對掃描到的像素,計算出它屬于的像素塊,并且計算像素塊的平均rgb值
3. 将rgb指派給掃描到的像素點。
4. 循環上面2,3步驟,直到所有像素點都完成。
程式效果:

像素格濾鏡源代碼如下:
package com.process.blur.study;
/**
* @author gloomy fish
* @date 2012-05-30
*
*/
import java.awt.image.bufferedimage;
public class pixellatefilter extends abstractbufferedimageop {
private int size;
public pixellatefilter() {
size = 10; // default block size=10x10
}
public pixellatefilter(int size) {
this.size = size;
@override
public bufferedimage filter(bufferedimage src, bufferedimage dest) {
int width = src.getwidth();
int height = src.getheight();
if ( dest == null )
dest = createcompatibledestimage( src, null );
int[] inpixels = new int[width*height];
int[] outpixels = new int[width*height];
getrgb( src, 0, 0, width, height, inpixels );
int index = 0;
int offsetx = 0, offsety = 0;
int newx = 0, newy = 0;
double total = size*size;
double sumred = 0, sumgreen = 0, sumblue = 0;
for(int row=0; row<height; row++) {
int ta = 0, tr = 0, tg = 0, tb = 0;
for(int col=0; col<width; col++) {
newy = (row/size) * size;
newx = (col/size) * size;
offsetx = newx + size;
offsety = newy + size;
for(int subrow =newy; subrow < offsety; subrow++) {
for(int subcol =newx; subcol < offsetx; subcol++) {
if(subrow <0 || subrow >= height) {
continue;
}
if(subcol < 0 || subcol >=width) {
index = subrow * width + subcol;
ta = (inpixels[index] >> 24) & 0xff;
sumred += (inpixels[index] >> 16) & 0xff;
sumgreen += (inpixels[index] >> 8) & 0xff;
sumblue += inpixels[index] & 0xff;
}
}
index = row * width + col;
tr = (int)(sumred/total);
tg = (int)(sumgreen/total);
tb = (int)(sumblue/total);
outpixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
sumred = sumgreen = sumblue = 0; // reset them...
}
}
setrgb( dest, 0, 0, width, height, outpixels );
return dest;
}