做了4个滤镜: 油画,木刻,变暗,浮雕
源代码下载:http://soulnew.googlepages.com/JPhoto.rar
滤镜的构架看上篇《标准MVC下图像处理器 1(框架)》, 这篇就讲算法。 滤镜的结构很简单,重写里面的一个方法就行了,所以希望这篇blog的看客,能写些别的滤镜出来,发给我或公布。
油画算法:
随机取周围某点象素,代替当前象素,最好随机取值的半径不要大于3,要不然不像油画了。
import java.util.Random; /** |
木刻算法:
我是将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; /** public void dopiexl(int[] pixels,int w,int h){ |
浮雕
将当前象素减去相邻的某点象素,再加上一个色彩补偿,因为可能减出负值来,所以最后的单种色彩要取绝对值。
最后合成象素。
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》