java标准MVC下图像处理器 2(滤镜)

来源:互联网 发布:淘宝1元秒杀在哪里 编辑:程序博客网 时间:2024/05/29 09:44

做了4个滤镜: 油画,木刻,变暗,浮雕

源代码下载:http://soulnew.googlepages.com/JPhoto.rar

滤镜的构架看上篇《标准MVC下图像处理器 1(框架)》, 这篇就讲算法。 滤镜的结构很简单,重写里面的一个方法就行了,所以希望这篇blog的看客,能写些别的滤镜出来,发给我或公布。

 

油画算法:

随机取周围某点象素,代替当前象素,最好随机取值的半径不要大于3,要不然不像油画了。

 
package com.soulnew.Grapha.Model;

import java.util.Random;

/**
 *
 * @author soulnew@gmail.com
 * @ blog:     http://souljava.blog.163.com
 */
public class CanvasPixelModel extends AbstractPixelModel {
    Random random=new Random();
   
    public CanvasPixelModel(){
       
    }
   
    public void dopiexl(int[] pixels,int w,int h){
        int[] save=pixels;
        for(int i=0;i<h;i++){
            for(int j=0;j<w;j++){
                int randomw=random.nextInt(3)-1;
                int randomh=random.nextInt(3)-1;
                if(j+randomw>=w||j+randomw<0){
                    randomw=0;
                }
                if(i+randomh>=h||i+randomh<0){
                    randomh=0;
                }
                pixels[i*w+j]=save[w*(i+randomh)+(j+randomw)];
            }
        }
    }
}

 

木刻算法:

 将颜色的每个单色分量加起来,求平均值 L。

我是将L取值范围分成了3段

L>190 : 象素取值0xffffffff;
190=>L>85 : 象素取值0x88888888;

0<L<=85 : 象素取值 0               

 package com.soulnew.Grapha.Model;
/**
 *
 * @author soulnew@gmail.com
 *    http://souljava.blog.163.com
 */
public class WoodCutPixelModel extends AbstractPixelModel {
   
    public WoodCutPixelModel() {
    }
   
    public void dopiexl(int[] pixels,int w,int h){
        //int[] save=pixels;
        for(int i=0;i<h;i++){
            for(int j=0;j<w;j++){
                int pixel=pixels[i*w+j];
                int red   = (pixel >> 16) & 0xff;
                int green = (pixel >>  8) & 0xff;
                int blue  = (pixel     ) & 0xff;
                if(((red+green+blue)/3)>190){
                    pixels[i*w+j]=0xffffffff;
                }else if(((red+green+blue)/3)>85){
                    pixels[i*w+j]=0x88888888;
                }else{
                    pixels[i*w+j]=0;
                }
                   
            }
        }
    }
}

 

 

变暗

获得象素的值,各个的颜色分量。然后每种颜色都乘以,一个相同的亮度衰减

然后再合成象素

 package com.soulnew.Grapha.Model;

import java.awt.Image;
import java.awt.image.MemoryImageSource;
import javax.swing.JFrame;

/**
 *
 * @author soulnew@gmail.com
 * @ blog:     http://souljava.blog.163.com
 */
public class DarkPixelModel extends AbstractPixelModel {
   
    public DarkPixelModel() {
       
    }   

    public void dopiexl(int[] pixels,int w,int h){
        for(int i=0;i<w;i++){
            for(int j=0;j<h;j++){
                int pixel=pixels[j*w+i];
               
                int alpha =0xff;
                int red   = (pixel >> 16) & 0xff;
                int green = (pixel >>  8) & 0xff;
                int blue  = (pixel     ) & 0xff;
                red=(int)(0.5*red);
                green=(int)(0.5*green);
                blue=(int)(0.5*blue);
                pixels[j*w+i]=(alpha<<24)|(red<<16)|(green<<8)|(blue);                 
            }
        }
       
    }
   
}

 

 

浮雕

将当前象素减去相邻的某点象素,再加上一个色彩补偿,因为可能减出负值来,所以最后的单种色彩要取绝对值。

最后合成象素。

 
package com.soulnew.Grapha.Model;
/**
 *
 * @author soulnew@gmail.com
 * @ blog:     http://souljava.blog.163.com
 */
public class EmbossmentPixelModel extends AbstractPixelModel{
    int rect=1;
    int coloradd=128;
    public EmbossmentPixelModel() {
    }
    public void dopiexl(int[] pixels,int w,int h){
        int[] save=pixels;
       
        for(int i=0;i<h;i++){
            for(int j=0;j<w;j++){
               
                if ((i+rect<h)&&(j+rect<w)){
                    int Apixel=save[(i+rect)*w+j+rect];
                    int Bpixel=save[w*i+j];
                    int Ared   = (Apixel >> 16) & 0xff;
                    int Agreen = (Apixel >>  8) & 0xff;
                    int Ablue  = (Apixel     ) & 0xff;
                    int Bred   = (Bpixel >> 16) & 0xff;
                    int Bgreen = (Bpixel >>  8) & 0xff;
                    int Bblue  = (Bpixel     ) & 0xff;
                    int red=Bred-Ared+coloradd;
                    int green=Bgreen-Agreen+coloradd;
                    int blue=Bblue-Ablue+coloradd;
                    pixels[i*w+j]=0xff<<24|Math.abs(red)<<16|Math.abs(green)<<8|Math.abs(blue);
                   
                }
            }
        }
    }
   
   
   
}

几个算法参考了《图像滤镜处理VC++实现方法》姚华等《microcomputer applications vol.18.no1.2002》

 
原创粉丝点击