滤镜的构架看上篇《标准MVC下图像处理器 1(框架)》, 这篇就讲算法。 滤镜的结构很简单,重写里面的一个方法就行了,所以希望这篇blog的看客,能写些别的滤镜出来,发给我或公布。
油画算法:
随机取周围某点象素,代替当前象素,最好随机取值的半径不要大于3,要不然不像油画了。
|
import java.util.Random; /** |
木刻算法:
将颜色的每个单色分量加起来,求平均值 L。
我是将L取值范围分成了3段
L>190 : 象素取值0xffffffff;
190=>L>85 : 象素取值0x88888888;
0
变暗 获得象素的值,各个的颜色分量。然后每种颜色都乘以,一个相同的亮度衰减 然后再合成象素 package com.soulnew.Grapha.Model; import java.awt.Image; /** public void dopiexl(int[] pixels,int w,int h){ 浮雕 将当前象素减去相邻的某点象素,再加上一个色彩补偿,因为可能减出负值来,所以最后的单种色彩要取绝对值。 最后合成象素。 几个算法参考了《图像滤镜处理VC++实现方法》姚华等《microcomputer applications vol.18.no1.2002》
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
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;
}
}
}
}
}
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() {
}
for(int i=0;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
if ((i+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);
}
}
}
}
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12379366/viewspace-220442/ ,如需转载,请注明出处,否则将追究法律责任。