| 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