服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java图像处理


  下面代码中用到的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);
}
}

扫描关注微信公众号