Java图像处理

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

  图像剪切

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

// importJava.awt.*;
// importjava.awt.image.*;
ImagecroppedImage;
ImageFiltercropFilter;
CropFilter
= new CropImageFilter( 25 , 30 , 75 , 75 ); // 四个参数分别为图像起点坐标和宽高,即CropImageFilter(intx,inty,intwidth,intheight),具体情况请参考API
CroppedImage = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(sourceImage.getSource(),cropFilter));
// 假如是在Component的子类中使用,可以将上面的Toolkit.getDefaultToolkit().去掉。
// FilteredImageSource是一个ImageProdUCer对象。

  图像缩放

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

ImagescaledImage
= sourceImage.getScaledInstance( 100 , 100 ,Image.SCALE_DEFAULT); // 得到一个100X100的图像
ImagedoubledImage = 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(ColorModelcm){
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 ;
ColorModelsourceModel;
int modelStyle;
public GrayModel(ColorModelsourceModel){
super (sourceModel.getPixelSize());
this .sourceModel = sourceModel;
modelStyle
= 0 ;
}
public GrayModel(ColorModelsourceModel, 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{
ColorModelsourceModel;
public ReverseColorModel(ColorModelsourceModel){
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(ColorModelcm){
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{
Imagesource,gray,gray3,clip,bigimg;
BufferedImagebimg,gray2;
GrayFilterfilter,filter2;
ImageIconii;
ImageFiltercropFilter;
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);
MediaTrackermt
= new MediaTracker( this );
mt.addImage(gray,
0 );
try {
mt.waitForAll();
}
catch (Exceptione){
}
}
public void paint(Graphicsg){
Graphics2Dg2
= (Graphics2D)g;
bimg
= new BufferedImage(iw,ih,BufferedImage.TYPE_INT_RGB);
Graphics2DsrcG
= bimg.createGraphics();
RenderingHintsrhs
= g2.getRenderingHints();
srcG.setRenderingHints(rhs);
srcG.drawImage(source,
0 , 0 , null );
ColorSpacegraySpace
= ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOpop
= 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(Graphicsg){
paint(g);
}
public static void main(Stringargs[]){
GrayImagem
= new GrayImage();
m.setSize(
400 , 400 );
m.setVisible(
true );
}
}

转自:http://www.knowsky.com/363901.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值