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》
- java标准MVC下图像处理器 2(滤镜)
- java 标准MVC下图像处理器 1(框架)
- Linux下图像处理软件汇总
- Linux下图像操作库
- 详谈动态窗口下图像放大功能
- Qt下图像自定义显示控件
- spring-mvc 详解(二)处理器
- 土壤质地标准转换程序Java MVC模式
- PowerBuilder方式下图像存储功能的研究
- PowerBuilder方式下图像存储功能的研究
- PowerBuilder方式下图像存储功能的研究
- PowerBuilder方式下图像存储功能的研究
- TextBox显示数据像下图这样,怎么做?
- 发贴庆祝下图像质量取得的突破!!!
- 谈谈iOS下图像颜色检测、颜色匹配的解决方法
- 谈谈iOS下图像颜色检测、颜色匹配的解决方法
- USB摄像头到ARM下图像显示方案
- iOS下图像颜色检测、颜色匹配的解决方法
- JavaScript方法和技巧大全【转载】
- ASP.NET编程中经常会用到的27个函数集
- 新申请了一个博客 以后就要记录我的点滴生活了
- 成熟
- 菜鸟怎样学好PHP
- java标准MVC下图像处理器 2(滤镜)
- WAP(wml)开发教程
- Visual Studio 2008、SQL Server 2008和Windows Server 2008
- Linux(RH9)下安装apache和subversion 方法:(7/19/07)
- 什么时候应该使用Web Service
- 要边输入边执行 还是焦点离开执行 onchange搞不定
- 娛樂由電腦製造時,它的門檻有多高?
- java图形博客搬到csdn
- asp.net验证码使用