我们也可以采用缓冲区来对图像进行处理。
在JAVA2D中图像处理模型是即时模式。
利用即时模式图像处理模型可以在内存中存储固定分辨率的图像,也可以对图像数据进行过滤处理。
JAVA2D在图像处理方面提供一对接口:
1
|
BufferedImageOp和RasterOp。
|
实现这两个接口的类包括:
1 2 3 4 5
|
AffineTransformOp,
BandCombineOp,
ColorConvertOp,
ConvolveOp,
LookupOp和RescaleOp等等
|
他们用来定义缓冲区图像和光栅图像的操作。 也可以产生几何变换,钝化,锐化,增强对比,阀值,和图像颜色校正等图像处理效果。
如何使用缓冲区:
PS:im是某个Image的引用 1)创建。
1
|
BufferedImage bi= new BufferedImage(getWidth(),getHight(),BufferedImage.TYPE_INT_ARGB);
|
还有三种不同的构造器。参看文档。 2)缓冲区上绘图。 先返回图像的上下文:
1
|
Graphics2D big=bi.creatGraphics();
|
利用这个对象将欲绘制的图像送入缓冲区。
1
|
big.drawImage(im,0,0,this);
|
3)显示缓冲区图像,利用Graphics2D 的drawImage方法将缓冲区图像绘制到屏幕上。 比如在JPanel的paintComponent() 方法当中
1 2
|
Graphics2D g2D=(Grahpics2D)g;
g2D.drawImage(bi,0,0,this);
|
下面步骤分析我总是假设人们需要在一个显示面板上显示,所以最后都加入了一个repaint();步骤
1 2
|
查找表过滤器:
LookupOp:rgba四个参数进行修改。
|
思路: 1)创建RescaleFactor和Offsets,他们可以是float型,也可以是float类型的数组。 2)创建RescaleOp对象。 RescaleOp rescale=new RescaleOp(scaleFactor,offset,null); 3)将过滤应用于缓冲rescale.filter(bi,bi); 4)repaint();
1
|
ColorConvertOp色彩转换过滤——灰度<->彩色
|
1)创建色彩空间对象. ColorSpace cs=ColorSpace.getInstance(ColorSpace.CS_GRAY); 2)创建颜色过滤器 ColorConvertOp op=new ColorConvertOp(cs,null); 3)将过滤应用于缓冲op.filter(bi,bi); 4)repaint();
1)创建float类型的数组,不同的数组决定了不同的处理功能。 //下面可以达到锐化效果 float data[]={-1.0f,-1.0f,-1.0f,-1.0f,9.0f,-1.0f,-1.0f,-1.0f,-1.0f,} //下面可以达到雾化效果 float data[]={1.0f/9.0f,1.0f/10.0f,1.0f/9.0f,1.0f/12.0f,1.0f/10.0f,1.0f/9.0f,1.0f/9.0f,1.0f/10.0f,1.0f/9.0f,} //下面可以达到边缘化效果 float data[]={0.0f,1.0f,0.0f, -1.0f,4.0f,-1.0f , 0.0f,-1.0f,0.0f} 2)创建卷积核对像_前两个参数表明宽度和高度。 Kernel kernel=new Kernel(3,3,data); 3)创建卷积过滤器实例n ConvolveOp convolve=new Convolve(kernel,Convolve.EDGE_NO_OP,null); 4)将过滤应用于缓冲convolve.filter(bisrc,bidest); 5)repaint();
对缓冲区图像进行缩放,拉伸,平移,旋转,等等。
1)定义仿射变换:AffineTransform类对象 :AffineTransform transform =new AffineTransform(); 2)对仿射变换对象进行设置变换,包括缩放,平移,拉伸,旋转等等。 transform.setToScale(double x,double y);//缩放 transform.setToShear(double x,double y);//平移 transform.setToTranslation(double x,double y);//拉伸 transform.setToRotation(double x,double y);//旋转 3)根据仿射变换过滤器创建过滤器对象 AffineTransformOp op=new AffineTransformOp(transform,null); 4)将过滤应用于缓冲op.filter(bisrc,bidest); 5)repaint();
|