论坛登陆 用户名:  密 码:
设为首页  加入收藏
08年北京名校秋季招生
名牌院校免试入学宽进严出,突破考分限制,名校与你零距离,以下院校按报名先后顺序录取,24小时网上报名覆盖全国
  您现在的位置: 中国教育招生在线 >> IT >> JAVA认证 >> IT正文
Java图像处理技巧四则
 作者:佚名     2007-3-14 17:30:20        来源:不详  浏览次数:

 

 

 

 

 

 

 

 

作者:Cherami


email:cherami@163.net




本人的另外一些作品请查看:http://www.smiling.com.cn/group/homepage.eCGI?group_id=23141




下面代码中用到的sourceImage是一个已经存在的Image对象


图像剪切

对于一个已经存在的Image对象,要得到它的一个局部图像,可以使用下面的步骤:


//import Java.awt.*;


//import java.awt.image.*;


Image croppedImage;


ImageFilter cropFilter;


CropFilter =new CropImageFilter(25,30,75,75);//四个参数分别为图像起点坐标和宽高,即CropImageFilter(int x,int y,int width,int height),详细情况请参考API


CroppedImage= Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(sourceImage.getSource(),cropFilter));


//如果是在Component的子类中使用,可以将上面的Toolkit.getDefaultToolkit().去掉。


//FilteredImageSource是一个ImageProducer对象。


图像缩放

对于一个已经存在的Image对象,得到它的一个缩放的Image对象可以使用Image的getScaledInstance方法:


Image scaledImage=sourceImage. getScaledInstance(100,100, Image.SCALE_DEFAULT);//得到一个100X100的图像


Image doubledImage=sourceImage. getScaledInstance(sourceImage.getWidth(this)*2,sourceImage.getHeight(this)*2, Image.SCALE_DEFAULT);//得到一个放大两倍的图像,这个程序一般在一个Swing的组件中使用,而类Jcomponent实现了图像观察者接口ImageObserver,所有可以使用this。


//其它情况请参考API。




灰度变换

下面的程序使用三种方法对一个彩色图像进行灰度变换,变换的效果都不一样。一般而言,灰度变换的算法是将象素的三个颜色分量使用R*0.3+G*0.59+B*0.11得到灰度值,然后将之赋值给红绿蓝,这样颜色取得的效果就是灰度的。另一种就是取红绿蓝三色中的最大值作为灰度值。java核心包也有一种算法,但是没有看源代码,不知道具体算法是什么样的,效果和上述不同。


/* GrayFilter.java*/


/*@author:cherami */


/*email:cherami@163.net*/


import java.awt.image.*;




public class GrayFilter extends RGBImageFilter {


int modelStyle;


public GrayFilter() {


modelStyle=GrayModel.CS_MAX;


canFilterIndexColorModel=true;


}


public GrayFilter(int style) {


modelStyle=style;


canFilterIndexColorModel=true;


}


public void setColorModel(ColorModel cm) {


if (modelStyle==GrayModel.CS_MAX) {


substituteColorModel(cm,new GrayModel(cm));


}


else if (modelStyle==GrayModel.CS_FLOAT) {


substituteColorModel(cm,new GrayModel(cm,modelStyle));


}


}


public int filterRGB(int x,int y,int pixel) {


return pixel;


}


}




/* GrayModel.java*/


/*@author:cherami */


/*email:cherami@163.net*/




import java.awt.image.*;




public class GrayModel extends ColorModel {


public static final int CS_MAX=0;


public static final int CS_FLOAT=1;


ColorModel sourceModel;


int modelStyle;


public GrayModel(ColorModel sourceModel) {


super(sourceModel.getPixelSize());


this.sourceModel=sourceModel;


modelStyle=0;


}


public GrayModel(ColorModel sourceModel,int style) {


super(sourceModel.getPixelSize());


this.sourceModel=sourceModel;


modelStyle=style;


}


public void setGrayStyle(int style) {


modelStyle=style;


}


protected int getGrayLevel(int pixel) {


if (modelStyle==CS_MAX) {


return Math.max(sourceModel.getRed(pixel),Math.max(sourceModel.getGreen(pixel),sourceModel.getBlue(pixel)));


}


else if (modelStyle==CS_FLOAT){


return (int)(sourceModel.getRed(pixel)*0.3+sourceModel.getGreen(pixel)*0.59+sourceModel.getBlue(pixel)*0.11);


}


else {


return 0;


}


}


public int getAlpha(int pixel) {


return sourceModel.getAlpha(pixel);


}


public int getRed(int pixel) {


return getGrayLevel(pixel);


}


public int getGreen(int pixel) {


return getGrayLevel(pixel);


}


public int getBlue(int pixel) {


return getGrayLevel(pixel);


}


public int getRGB(int pixel) {


int gray=getGrayLevel(pixel);


return (getAlpha(pixel)<<24)+(gray<<16)+(gray<<8)+gray;


}


}


如果你有自己的算法或者想取得特殊的效果,你可以修改类GrayModel的方法getGrayLevel()。




色彩变换

根据上面的原理,我们也可以实现色彩变换,这样的效果就很多了。下面是一个反转变换的例子:


/* ReverseColorModel.java*/


/*@author:cherami */


/*email:cherami@163.net*/


import java.awt.image.*;




public class ReverseColorModel extends ColorModel {


ColorModel sourceModel;


public ReverseColorModel(ColorModel sourceModel) {


super(sourceModel.getPixelSize());


this.sourceModel=sourceModel;


}


public int getAlpha(int pixel) {


return sourceModel.getAlpha(pixel);


}


public int getRed(int pixel) {


return ~sourceModel.getRed(pixel);


}


public int getGreen(int pixel) {


return ~sourceModel.getGreen(pixel);


}


public int getBlue(int pixel) {


return ~sourceModel.getBlue(pixel);


}


public int getRGB(int pixel) {


return (getAlpha(pixel)<<24)+(getRed(pixel)<<16)+(getGreen(pixel)<<8)+getBlue(pixel);


}


}


/* ReverseColorModel.java*/


/*@author:cherami */


/*email:cherami@163.net*/




import java.awt.image.*;




public class ReverseFilter extends RGBImageFilter {


public ReverseFilter() {


canFilterIndexColorModel=true;


}


public void setColorModel(ColorModel cm) {


substituteColorModel(cm,new ReverseColorModel(cm));


}


public int filterRGB(int x,int y,int pixel) {


return pixel;


}


}


要想取得自己的效果,需要修改ReverseColorModel.java中的三个方法,getRed、getGreen、getBlue。


下面是上面的效果的一个总的演示程序。


/*GrayImage.java*/


/*@author:cherami */


/*email:cherami@163.net*/


import java.awt.*;


import java.awt.image.*;


import javax.swing.*;


import java.awt.color.*;




public class GrayImage extends JFrame{


Image source,gray,gray3,clip,bigimg;


BufferedImage bimg,gray2;


GrayFilter filter,filter2;


ImageIcon ii;


ImageFilter cropFilter;


int iw,ih;


public GrayImage() {


ii=new ImageIcon("images/11.gif");


source=ii.getImage();


iw=source.getWidth(this);


ih=source.getHeight(this);


filter=new GrayFilter();


filter2=new GrayFilter(GrayModel.CS_FLOAT);


gray=createImage(new FilteredImageSource(source.getSource(),filter));


gray3=createImage(new FilteredImageSource(source.getSource(),filter2));


cropFilter=new CropImageFilter(5,5,iw-5,ih-5);


clip=createImage(new FilteredImageSource(source.getSource(),cropFilter));


bigimg=source.getScaledInstance(iw*2,ih*2,Image.SCALE_DEFAULT);


MediaTracker mt=new MediaTracker(this);


mt.addImage(gray,0);


try {


mt.waitForAll();


} catch (Exception e) {


}


}


public void paint(Graphics g) {


Graphics2D g2=(Graphics2D)g;


bimg=new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);


Graphics2D srcG = bimg.createGraphics();


RenderingHints rhs = g2.getRenderingHints();


srcG.setRenderingHints(rhs);


srcG.drawImage(source, 0, 0, null);


ColorSpace graySpace=ColorSpace.getInstance(ColorSpace.CS_GRAY);


ColorConvertOp op=new ColorConvertOp(graySpace,rhs);


gray2=new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);


op.filter(bimg,gray2);


g2.drawImage(source,40,40,this);


g2.drawImage(gray,80,40,this);


g2.drawImage(gray2,120,40,this);


g2.drawImage(gray3,160,40,this);


g2.drawImage(clip,40,80,this);


g2.drawImage(bigimg,80,80,this);


}


public void update(Graphics g) {


paint(g);


}


public static void main(String args[]) {


GrayImage m=new GrayImage();


m.setSize(400,400);


m.setVisible(true);


}


}




责任编辑:lss
  相关新闻
JSFToolbox--用Dreamweaver开发JSF
Java模板引擎Velocity基本语法
【JAVA基础】JDBC连接DB2数据库详解
为什么要学习Java,成为Java程序员
Java基础-漫谈EJB在Java中的应用
漫谈EJB在Java中的应用(二)
J2EE技术-漫谈EJB在Java中的应用
JAVA测试:使用JMock来实现孤立测试
看看如何在Struts应用中施展AJAX魔法
通过java.net.Socket类抓取网页内容
为什么要学习Java,成为Java程序员
Java基础-漫谈EJB在Java中的应用
漫谈EJB在Java中的应用(二)
运用Jakarta Struts的七大实战心法
通过Java Swing 看透MVC设计模式
开发保留标准浏览器功能的AJAX应用程序
Web框架趣谈之Java Web 框架的甜点
Web2.0时代的核心应用:Ajax简介
精华:AJAX开发简略(第一部分)
Thinking in AJAX(三)——AJAX框架汇总
  评论
现在有100人对本文发表评论
查看所有评论
 
推  荐
 
100本成功必读热销书
热门招生
  北京文理研修学院   前进大学
  北京明园大学   北京建设大学
  北京邮电大学世纪学院   北方工商管理学院
  联想软件定向委培班   香港数码动画学院
  青年企业管理研修学院   北京华夏管理学院
热门培训
网络化办公专家培训认证 电子科技大学软件学院
软件测试工程师培训认证 北大青鸟十大授权培训
IT硬件工程师培训认证班 北京环球雅思荷兰预科
JAVA开发工程师培训 潜能时代IT服务管理培训
网络信息化工程师培训 清华大学继续教育学院
论坛精选
 
有些细节是男人也该注意的风度!最容易读错的字
某强人手机里保存的30条短信 中国十大高薪职业
最感人的十大韩剧经典台词 嫁给工程师的N个理由
爆强!只有一句话的鬼故事 转贴教你如何做妖精
 女人一定要記住的話 女人最好别嫁给最爱的男人
城市联盟
 大连 上海 天津 广州 西安 深圳  天津  青岛  大连  福州  沈阳  青海  连云港  南京  吉林  厦门  威海  辽宁  呼和浩特
Copyright © 2006   www.edu999.com   All rights reserved. 中国教育招生在线  版权所有
北京市通信管理局[2004]字第552号函    京ICP证040442号