java中的图象处理技术基础

      一个图象,可以表示成一个多维数组.(这个就不细说原因了.嘿嘿)但是不同的图象格式存储的格式是不一样的,比如,灰度图象可以简单的表示成二维的.每个像素值的范围是(0-255),其中0表示黑,255表示白.但是,彩色的图象可以表示成三维的数组.其中的一个维度用来表示不同的颜色分量.比如.jpg格式的图象每个像素值都有三个分量,R,G,B(红绿蓝)这三种颜色按分量的不同可以组合成其他的任意颜色.
      不废话了,下面要说的是java中对图象的处理.java用一个2维的int型数组来表示所有图象的像素值,为什么可以这样呢?因为int型是4个字节,低位三字节用来表示三个颜色分量,而最高位字节则用来表示该像素是否透明.(具体可以查询相公资料)对于灰度图,后三字节取相同的值,每个字节的值都表示像素的亮度.
      基本上所有的图象处理都和像素是紧密联系的.下面就通过一个例子来说明处理的过程.
//灰度变换示例.
//读图象
 public Image readImage(String str)
 {
  Image image = Toolkit.getDefaultToolkit().getImage(str);
  MediaTracker tracker = new MediaTracker(this);
  tracker.addImage(image, 0);
  try { tracker.waitForID(0); }
  catch (InterruptedException exception) {}
  try
  {
  image = ImageIO.read(new File(str));
  }
  catch (IOException exception)
  {
  exception.printStackTrace();
  }
  return image;
 }
//取像素值
public Image changeToGray(Image src)
{
 int srcWidth=src.getWidth(this);//图象宽
 int srcHeight=src.getHeight(this);//图象高度
 int pixelsSource[]=new int[srcWidth*srcHeight];
 int pixelsDestnation[]=new int[srcWidth*srcHeight];//两个内存缓冲数组 

 PixelGrabber pixelGrabber=new PixelGrabber(src,0,0,srcWidth,srcHeight,pixelsSource,0,srcWidth);//与图象关联
 try{
  pixelGrabber.grabPixels();//取像素
 }catch(InterruptedException e){}

 for(int i=0;i<srcHeight;i++)//对每个像素进行转化
 {
  for(int j=0;j<srcWidth;j++)
  {
   pixelsDestnation[i*srcWidth+j]=toGray(pixelsSource[i*srcWidth+j]);
  }
 }
//从数组中还原出图象 
MemoryImageSource memoryImage=new MemoryImageSource(srcWidth,srcHeight,pixelsDestnation,0,srcWidth);
 return createImage(memoryImage);
}
//灰度变换公式
public int toGray(int i)
{
 int r,g,b,gary;
 r=g=b=i;
 r=r&(0xff);
 g=(g&(0xff00))>>8);
 b=(g&(0xff0000))>>16;
 gray=(int)r*0.33+g*0.56+b*0.11;
 return gray;
}

posted on 2006-11-02 14:25  空空色色  阅读(520)  评论(0编辑  收藏  举报