学习网考试学习资料

Gzu521.com

Java图像处理技巧四则

Java教程   点击:次   发布时间:2005-7-22   【字体: 】   来源:
Gzu521.com我的学习网
  下面代码中用到的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 
else if (modelstyle==graymodel 

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); 

}

责任编辑:gzu521

网络编程分类
ASP教程
.Net教程
Java教程
PHP教程
数据库基础
ACCESS教程
SQL Server教程
MySQL教程
Oracle教程
分类推荐信息
更多...
大类最新文章
更多...