zoukankan      html  css  js  c++  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, 
    00null);
    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);
    }
    }

    转自:http://www.knowsky.com/363901.html 
  • 相关阅读:
    转载: jQuery事件委托( bind() live() delegate()) [委托 和 绑定的故事]
    转载:CPU的位数和操作系统的位数
    javascript 过滤空格
    转载: js jquery 获取当前页面的url,获取frameset中指定的页面的url(有修改)
    转载:struts标签<s:date>的使用
    转载:s:if的用法
    解决cordova-plugin-actionsheet导致Android丑陋的问题
    ionic框架对Android返回键的处理
    解决魅族手机无法连接Mac调试
    谷歌开发者大会传达的8条关键信息
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470445.html
Copyright © 2011-2022 走看看