java语言中的图像处理技巧。 图形化是当前计算机人机界面的发展趋势之一,在一个复杂的图形界面中,其实只有很少部分是程序执行过程中调用程序库当时画出来的,而大部分是直接调用已有的图像文件或将其做一些处理再显示出来。本文将要讨论的就是在java语言中,如何实现对已有静态图像文件的调用,如何实现图像动画,以及如何实现图像的推进、回缩和淡入、淡出等特殊效果,并讨论了改善图像显示质量的有效途径。

一、静态图像的调用显示

1. 图像文件的载入

在java中提供了两种将现有的图像文件载入的方法 :一种是利用java.applet.applet中的getimage()方法;另一种是利用java.awt.toolkit中的getimage()方法。这两种方法的区别是编写java应用程序时,只能使用java.awt.toolkit中的方法,而编写java小程序时,两种都可以使用。值得注意的是,可以直接载入并输出的图像文件格式目前只有gif和jpeg两种 。

例如:有如图1-1所示图像文件image1-1.jpg,则可用下面的程序段将其载入:

toolkit toolkit=toolkit. getdefaulttoolkit();
image image1=getimage(“image1_1.jpg”);

java怎么处理jpg图片格式 java 处理图片_java怎么处理jpg图片格式

图1-1

2. 图像的输出

将图像载入后就可以输出了,这时可利用java.awt包中graphics类的drawimage()方法。例如下面的程序段:

public void paint(graphics g)
{ g.drawimage(image1,100,100,this);
//图像出现的坐标点为(100,100)
}

二、 图像动画的实现

图像动画的实现是以模仿动作的次序来显示图像的过程,因此其方法是:将一系列静态图像(如图2-1至图2-7)快速连续地显示,即先利用java.awt包中的graphics类的drawimage()方法在屏幕上画出第一幅图像(图2-1),然后利用另外定义的一个线程来控制第二、第三等余下系列图像在较短时间内的连续显示,这样看起来就是动画了 (将图2-1至图2-7连续显示出来,就会看到卫星围绕着地球在转动) 。

java怎么处理jpg图片格式 java 处理图片_java怎么处理jpg图片格式_02

图2-1

java怎么处理jpg图片格式 java 处理图片_java_03

图2-2

java怎么处理jpg图片格式 java 处理图片_java怎么处理jpg图片格式_04

图2-3

java怎么处理jpg图片格式 java 处理图片_淡入_05

图2-4

java怎么处理jpg图片格式 java 处理图片_淡入_06

图2-5

java怎么处理jpg图片格式 java 处理图片_java怎么处理jpg图片格式_07

图2-6

java怎么处理jpg图片格式 java 处理图片_java图像处理重要的类和方法_08

图2-7

按照上述方法编写程序并运行后,我们会发现动画的质量并不高,主要表现在两个方面:一是画面不流畅,有时有的图像显示停顿,甚至于中间死机。二是画面闪烁。

产生第一个问题主要是因为当用上述的getimage()方法载入图像时,系统会立即生成一个image对象,并且返回程序对象的引用,但这并不表示图像文件的数据已读到了内存之中,而是系统在这同时,产生了另一个线程去读取图像文件的数据,因此程序已经执行到了getimage()后面的部分,但是系统还可能正在读图像文件的数据,从而造成图像在显示之前没有完全载入、载入过程中出错或是根本不能载入等。解决的办法是利用java.awt包中的mediatracker类对图像的载入过程进行控制,用该类的waitforid()和waitforall()方法预装图像,相应地用statusid()或statusalll()方法来确定这些图像是否成功载入。这几种方法可用如下格式:

void waitforall(long ms); // ms参数为等待的时间
void waitforid(int id, long ms);//id参数为图像系列号
int statusall(boolean load);
int statusid(int id, boolean load);

产生第二个问题的原因是,当程序调用repaint()方法重画屏幕时,repaint()方法接着调用update()方法,默认的update()方法用背景色清除绘画区,然后调用paint()方法重画窗口内容,这样反复的动作造成时间的浪费,当绘制一幅新图像所需的时间超过屏幕的刷新周期时,这幅图的不同部分就在不同的刷新周期中绘制,于是造成了画面闪烁。

通过闪烁产生的原因的分析,可以找到一些解决问题的办法:

1.重载update()方法。因为缺省的update()方法中清除背景的动作是多余的,所以可以免去,而直接调用paint()方法。

2.使用剪辑区。即为需要更新的区域定义一个剪辑区,只重画屏幕的该区域。

3. 采用双缓冲技术。即在内存的一个脱屏缓冲区上画所需的图像,然后把这个缓冲区的内容拷贝到屏幕上。

三、实现特殊效果的图像

有了制作动画的基础,就可以实现一些特殊动画效果的图像。以下主要说明图像的两种特殊效果的实现方法,一种是图像的推进或回缩,另一种是图像的淡入或淡出。

1. 图像的推进或回缩

这种特殊效果的关键是使用java.awt包中graphics类的drawimage()方法,在该方法的参数中指定图像的输出范围(如:指定为原图的1/16),然后另外定义一个线程,利用该线程控制每隔一段时间(如:100ms)将图像的输出范围扩大一定比例(如:增加原图的1/16),并调用repaint()方法重画窗口,于是可以看到图像逐渐放大、推进直到全屏幕的效果 (如图3-1至图3-3所示为推进、回缩演示程序的运行结果)。

java怎么处理jpg图片格式 java 处理图片_java图像处理重要的类和方法_09

图3-1

java怎么处理jpg图片格式 java 处理图片_数据_10

图3-2

java怎么处理jpg图片格式 java 处理图片_淡入_11

图3-3

制作图像的回缩效果的方法是类似的,利用线程使图像的输出范围由原图按比例缩小就行了。同样,如果改变drawimage()方法的参数中的图像输出的坐标,可产生使一幅或多幅图像按自己设定的路线在屏幕上不停移动的效果。

2. 图像的淡入或淡出

图像的淡入效果是缓慢地把像素从第一个图像(如图4-1)变换到第二个图象(如图4-2)的像素中,即显示了第一幅图像之后,显示两幅图像被融合起来的多个版本(如图4-2至图4-4),并慢慢过渡到第二幅图像。当然,如果已经有了多个两幅图像逐渐融合在一起的的图像文件,可以用已介绍的制作图像动画的方法来制作淡入、淡出的效果,而这里要介绍的是如何由原图通过设计程序来实现。

java怎么处理jpg图片格式 java 处理图片_淡入_12

图4-1

java怎么处理jpg图片格式 java 处理图片_淡入_13

图4-2

java怎么处理jpg图片格式 java 处理图片_java图像处理重要的类和方法_14

图4-3

java怎么处理jpg图片格式 java 处理图片_java_15

图4-4

java怎么处理jpg图片格式 java 处理图片_淡入_16

图4-5

其设计思想是:用已介绍的getimage()方法将两幅图像都载入内存,为内存中的第二幅图像的对象获得图像产生器,图像生成器生成用于图像的像素数据,这些像素数据是按一定的规律存储在内存中的,在java中使用颜色模型来定义其他成像类应该如何理解像素数据,以抽取颜色信息进行处理,默认的颜色模型把单个像素的颜色存放在一个32位的整数中。如下图所示:

java怎么处理jpg图片格式 java 处理图片_java图像处理重要的类和方法_17

该模型中,24~31位存放α成分,即像素的透明度,α值为0表示像素是透明的,α值为255表示像素是不透明的,而α值为0~255之间就是半透明象素了。自己编制一个图像过滤器类从图像生成器中取出图像数据,再定义一个线程将第二幅图像每个像素的透明度逐渐由透明变成不透明的,在paint()方法中先后输出第一和第二幅图,重画窗口时,可以看到第二幅图像逐渐覆盖了第一幅图像,当第二幅图像变成不透明的时,看到的就是第二幅图像了(见图4-1至图4-5所示的淡入、淡出演示程序执行结果图)。

图像淡出效果的制作类似,不同的是利用线程将第二幅图像由不透明逐步变成透明的,于是就看到了第一幅图像。

四、结束语

以上简单介绍了java中的一些图像处理的技巧,可以看出利用java可以制作多姿多彩的图像,而其平台独立性更是为她平添了几分魅力。