天天看点

《Java数字图像处理:编程技巧与应用实践》——2.3 基于BufferedImageOp的图像滤镜演示

本节书摘来自华章计算机《java数字图像处理:编程技巧与应用实践》一书中的第2章,第2.3节,作者 贾志刚,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

通过前面两节的学习,我们已经大致了解bufferedimageop接口及其实现类的功能。实践出真知,本节将演示bufferedimageop接口中每个实现类的实际使用场景,达到知行合一、学以致用的目的,帮助大家解决项目中遇到的实际问题。为了让大家对应用效果有更加深刻的印象,下面会使用bufferedimageop的实现类来实现如下几个滤镜特效功能。

黑白滤镜:将彩色图像自动转换为黑白两色图像。

灰度滤镜:将彩色图像自动转换为灰度图像。

模糊滤镜:使图像产生模糊效果。

放缩滤镜:使图像放大或缩小。

1 . ui实现部分

在介绍基于swing的ui实现时,关于swing ui部分的编程知识将在下一章中详细剖析与解释,本节的重点放在滤镜实现部分,大致的ui布局如图2-3所示。

《Java数字图像处理:编程技巧与应用实践》——2.3 基于BufferedImageOp的图像滤镜演示

2.滤镜部分的实现

(1)colorconvertop实现灰度功能

colorconvertop主要用于实现各种色彩空间的转换,从而达到转换bufferedimage对象类型的目的,也可以在实例化colorconvertop对象时指定色彩空间。当前支持的色彩空间有五种,实现灰度功能时,只需在实例化colorconvertop时指定色彩空间为colorspace.cs_gray,然后调用它的filter方法得到返回图像即可。灰度化的源代码如下:

(2)lookupop 实现黑白功能

lookupop在实例化时需要传入lookuptable实例,当前lookuptable接口的两个实现类分别为bytelookuptable与shortlookuptable。类关系图2-4可以很好地说明它们之间的关系。

《Java数字图像处理:编程技巧与应用实践》——2.3 基于BufferedImageOp的图像滤镜演示

运用lookupop实现彩色图像变成黑白单色图像的功能时,首先要将图像灰度化,然后针对灰度图像在lookuptable中根据像素值进行索引查找,以便设置新的像素值,从而得到黑白单色图像,代码如下:

(3)convolveop 实现模糊功能

convolveop是实现模板卷积功能操作的类,通过简单设置卷积核/卷积模板就可以实现图像模糊功能,实现代码如下:

但是当你想对大多数jpg格式图片的bufferedimage对象实现模糊功能时,很多情况下java会抛出如下错误消息:

原因在于jdk读入jpg格式图像时,多数情况下使用了type_3byte_bgr存储方式,而bufferedimageop实现的滤镜不支持操作该存储方式的bufferedimage对象,这样就导致了上面的错误。解决之道很简单,就是通过colorconvertop把图像从类型type_3byte_bgr转换为type_int_rgb的bufferedimage对象。所以模糊功能的完整源代码如下:

converttype方法的代码如下:

(4)affinetransformop实现图像zoom in/out的功能

affinetransformop支持的操作包括图像的错切、旋转、放缩、平移。要实现图像的放缩功能,首先要通过affinetransform.getscaleinstance来获取scale实例,然后作为参数初始化affinetransformop对象实例,最后调用filter方法即可。实现图像放缩功能的代码如下:

需要传入的三个参数包括:bi是bufferedimage对象实例,代表要放缩的图像;sx表示在x方向的放缩比率;sy表示在y方向的放缩比率。

完整的ui部分代码如下:

这里主要是基于jframe对象实现ui部分,通过重载jpanel的paintcomponent()方法来显示原图与处理后的效果图。按钮动作响应通过监听actionlistener来实现,处理完以后通过调用repaint()方法来实现ui刷新。