天天看点

《Java数字图像处理:编程技巧与应用实践》——2.2 Java BufferedImageOp API

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

本节将介绍java中最常用的操作图像像素的api接口bufferedimageop,通过它,可以实现图像像素的调整,呈现出不同的图像显示效果,并且可编辑图像内容等。

当前bufferedimageop接口中最重要的方法是filter()方法,这是所有实现类必须完成的。目前bufferedimageop有下面五个实现类。

affinetransformop :主要操作是提供各种旋转、错切、放缩功能。

colorconvertop :主要操作是提供像素灰度功能。

convolveop: 主要用来实现图像卷积操作,可以实现模糊、边缘提取等效果。

lookupop :主要用来实现图像像素颜色的各种变换、反色等操作。

rescaleop: 主要用来实现图像对比度与亮度的调整操作。

对应的类关系图如图2-2所示。

《Java数字图像处理:编程技巧与应用实践》——2.2 Java BufferedImageOp API

首先来看看如何读取一个像素的rgb值。读取一个像素点的rgb值的代码如下:

其中index表示该像素点位置,row表示纵坐标位置,col表示横坐标位置。图像左上角的像素点对应位置坐标为(0,0),右下角的位置坐标为(height-1, width-1),这里的height又表示图像的高度,width表示图像的宽度。

设置一个像素点的rgb值的代码如下:

其中ta表示透明度的值、tr表示red通道值、tg表示green通道值、tb表示blue通道值,它们的取值范围为[0~255]。

当创建的bufferedimage对象为argb类型,使用imageio保存为jpg格式时,你可能会发现图像与在swing ui中显示的不一样,色差很大,原因在于argb类型与jpg格式不是很兼容,选择argb时最好保存为png格式,而rgb格式保存为jpg格式。

当笔者初次接触java image api时,在学习过程中遇到了各种各样的问题。下面整理总结一下初学者经常遇到的问题。

1)图像格式支持。很多人会用java image api来读取tiff文件,可惜这种格式并不被支持,在jdk6中,java imageio类只支持几种常见的图像格式(png、jpg、gif、bmp),其他均不支持。

2)透明通道的支持与文件保存。如果bufferedimage对象为argb格式,说明支持透明通道,最佳的保存格式为png格式,否则会造成图像信息丢失,保存失真。

3)加载图像资源文件。很多人不知道如何加载图像资源文件,笔者最喜欢的做法是把要使用的图像文件与class文件放在同一个package中,然后通过如下代码加载:

4)处理结果显示的像素里有大片的白点或黑白斑点,最可能的原因在于你的rgb像素值取值范围超过了[0~255],请仔细检查。

5)如何在bufferedimage对象上绘制各种几何形状与文字等信息?使用如下代码即可:

6)如何获取图像的位深度?通常位深度(bit depth)与图像存储像素字节位数有关系。

深度为16位通常的存储格式为rgb,前两个通道red与green各占5位,最后一个blue通道占6位,总计16位两个字节,深度为24位通常的存储格式为rgb,分别占8位,总计三个字节,深度为32位通常包含透明通道,且为argb格式,每个通道占1个字节,总共32位,4个字节。