天天看點

圖像處理------像素格效果

圖像中的像素格效果是最常見的圖像特效,可以隐藏或者模糊一些不想被顯示出來的圖像細

節,是常用的圖像處理手段。

像素格效果的算法其實非常的簡單,隻是對圖像進行塊掃描,求出每個像素塊的平均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;  

}