“中国眼”全功能看图软件
2009-01-08
作者:张颖
1. 引言
JAVA是开发服务器,个人应用,移动设备的极好的技术。因为跨平台的需要使得JAVA在服务器和移动设备方面非常成功。现在虽然在个人电脑方面还不是很令人满意,但JAVA正在以比你想像还快的速度改进着。在这篇论文中,我将分析JAVA将怎样改变现在的桌面世界,然后展示用标准J2SE构建的全功能看图软件。
.桌面系统和JAVA
现在主流的桌面平台是:Windows,Mac和Linux。它们都不是完美的。Windows统治着桌面市场,有着大量的应用软件和开发者,但很多要花钱,并且存在安全漏洞;Linux有着安全基础,并且是开源的,但没有Windows用起来那么顺手;Mac非常好用,也不是像Windows那样成为黑客攻击的对象,但其硬件、软件的选择比Windows和Linux要受限制的多。公司和个人选择操作系统是要考虑很多因素的:尽量低的价格,尽量高的安全性占第一位,这让很多人转向了Linux(比如中国的军用平台就只能用Linux)。友好的使用环境,大量的应用软件使得Windows仍然占用很大的市场份额。Mac有着忠实的用户。日益健壮的Linux市场,还有Mac的中兴使得它们都大力运用JAVA技术,以便成为更加重要得桌面系统。
.跨平台支持
JAVA能在所以相关平台上运行,如果哪个组织想不改变软件的现有代码就能跨平台使用,那么JAVA就是最好得桌面开发平台。也许用Microsoft得可视化开发工具创建.NET程序很轻松,但这会使你局限于Windows平台。如果你用JAVA开发应用程序,你不会因为代码重构引起麻烦。JAVA的GUI能够在各种平台上看起来一样,也能根据需要模拟平台样式。JAVA的安全性也是有目共睹的,这省去了不少后期维护工作。Sun公司桌面系统的推出,JDK1.5的升级,这给了广大的JAVA开发者一个很好的机遇和挑战。随着JAVA技术的不断成熟和多种IDE软件的出现,开发出的JAVA应用软件会更友好,开发周期也会更短,维护也更为方便。
.成功典范
Borland公司的JBuilder开发环境;NetBean组织的NetBean,以及IBM公司的Ecllipse。这些都是大型的桌面开发软件,还有很多跟广大计算机用户密切相关的软件,如永中Office,JFtp,Robocode,JLGui等等。
2. 实例分析
.项目描述
“中国眼” 是北信JAVA实验室用纯JAVA语言写成的、成功的看图软件。它运用了JAVA天然的跨平台特性;融合了XML,多线程,css,javascript等多种技术;支持BMP,XMP,JPG,JPEG,GIF,PNG,PCX。并且有很强的安全性和稳健性。软件只有400多K,很方便在网上传输。运行环境为J2SE1.4以上。软件已经在Windows 98,2000,XP,2003,Linux RedHat9 通过了测试。
它具有看图,图片处理,格式转换,文件管理等多种功能。能幻灯片放映,图像渲染(柔化,锐化,亮化,暗化,浮雕化等),以极快速度缩放,重命名,屏幕取色,图像翻转,图像裁剪,创建"我的相册簿",全屏看图,支持鼠标拖拽装入图片。
说到图像处理,也许有人会想到用JAI(Java Advanced Imaging),但这会使得那些没有安装这个包的人很被动,而且这个包处于β版,性能不稳定,所以在该软件中没有用JAI。
“中国眼”的图像处理速度,它的小巧,它的强大功能会给用户留下深刻映象。并且它是免费的。
图一:“中国眼”的系统层次
对于Swing主件的绘图设置,最好用paintComponent,这样能够用缺省的双缓冲机制。
图二:“中国眼”的图形显示
看图软件要是没有幻灯片放映会很逊色的,而JAVA幻灯片放映的实现是离不开线程的,不过线程的开始停止用那些supend,或者是stop 是不安全的,所以在run里面用循环变量来控制是比较好的选择,下面是SlideShow:
public class slideshow extends Thread{
public void run(){
while(slideshowbegin==true)
try{ cycleloadImage(KeyEvent.VK_SPACE);
if(slideshowbegin==false) break;
Thread.sleep(2000);//停止2000ms}
catch(InterruptedException e) {System.out.println(e.toString());}
}}
对图像文件的处理少不了要存储一些图像信息,比如说你要创建个人相册簿,那么少不了对图像发生年代、背景的记述。Java于XML的结合使得这样的这变得很容易处理。
public static Document createDomDocument(String imagepath,String description)
{ Document doc=parseXmlFile()
Element element; //加入根节点元素
if(doc.hasChildNodes()){element=doc.ge tDocumentElement();}
else{
element = doc.createElement("Description");
doc.appendChild(element);
Comment comment = doc.createComment("以下是各个图像的描述信息");
//对元素节点插入comment
doc.insertBefore(comment, element);
}
String xpath = "//*[@path='"+imagepath+"']";
try{ // 得到匹配的元素
NodeList nodelist = org.apache.xpath.XPathAPI.selectNodeList(doc, xpath);
//处理节点表中的元素
if(nodelist.getLength()!=0)element.removeChild((Element)nodelist.item(0));
}
catch(javax.xml.transform.TransformerExceptione){System.out.println(e.toString());}
Element imageinfo=doc.createElement("ImageInfo");//创建元素节点
element.appendChild(imageinfo);
imageinfo.setAttribute("path",imagepath);//设置元素属性,用图像路径来表示
imageinfo.appendChild(doc.createTextNode(description));
return doc;
}
sun.awt.shell.ShellFolder sf= sun.awt.shell.ShellFolder.getShellFolder(file);
ImageIcon icon= new ImageIcon(sf.getIcon(true), sf.getFolderType());
得到文件的系统图标,这样就不会使人们在不同平台下使用本软件时感到陌生,这也是Java L&F的最好表达。
图三:图形的通用界面 图四:图形的柔化
对应每种图像处理建立不同的处理类,都放在ImageProcess包下。图形的柔化处理用了JAVA内建的卷积类:
//一个图像柔化就是把每一个象素和它周围的8个象素平均
float weight = 1.0f/9.0f;
float[] elements = new float[9];
for (int i = 0; i < 9; i++)elements[i] = weight;
Kernel kernel = new Kernel(3, 3,elements);
BufferedImageOp op = new ConvolveOp(kernel);
3.总结和展望
JAVA初衷是为在浏览器上运行APPLET而创建的网络技术,但它通用有能力在桌面系统运行的非常好,就那“中国眼”看图软件来说,经过测试,缩放同样的图像,花费的时间比ACDSee,以及IrfanView快的多,稳定性好。不要忘了它还有最大的优势就是跨平台的。这也是“Write Once, Run Anywhere”的最好应证。
参考文献:
[1] java.sun.com
[2] http://www.onjava.com/pub/a/onjava
[3] http://community.java.net/javadesktop
[4] http://www-106.ibm.com/developerworks/java/
[5] Philip Brow www.bolthole.com n
[6] Matthias www.burgsoft.de