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;
}