利用 JSP 代码管理您的图像(3) - 编程吧

上一篇 | 下一篇

利用 JSP 代码管理您的图像(3)

发布: 2006-7-09 17:37 | 作者: 佚名 | 来源: 不详 | 查看: 95次

前一节研究了编写定制 JSP 标记的步骤。 ImageSizerTag 类会自动重新调整图像的大小以匹配用户的首选项。这一节提供了有关您可以如何使用 ImageSizer 类来重新调整图像大小并将其保存为 JPEG 文件的更多详细信息。利用 java.awt.Image 类中的 getScaledInstance 方法,很容易在 Java 代码中重新调整图像的大小。利用新的宽和高调用这个方法,或者为某个参数提供一个值 -1 以保持纵横比,您可以得到新的重新调整过大小的图像。但是,就象任何 Java 图像一样,该图像并不是立即可用的,因此您必须使用 java.awt.MediaTracker 以等待图像完全装入。 ImageSizer 的 waitForImage 方法封装了该代码。

在该示例中,最难的设计点在于决定如何保存图像。用 Java 编程编码和保存图像有很多选择,所有选择都有不同的权衡。

com.sun.image.codec。该包在 Java 2 SDK 1.2 和 1.3 实现中是可用的,但它在私有(private)包中,在将来的 Java 2 版本中这可能会发生变化。该包只限于 JPEG 编码。
Java Image I/O API。在 Java 2 SDK 1.4 中,该包是公共的和标准的。但是,在撰写本文时,还没有使用 SDK 1.4 的 J2EE 版本。该包提供了良好的图像操作功能和编码选项。
Java 高级映象 API(Java Advanced Imaging API)。这个 API 是一个标准扩展,但是使用它需要安装包 — 您的 Web 管理员可能不支持该工作。
ACME GIF 编码器(ACME GIF Encoder)。该软件及许多其它第三方图像包很有用,您可以将它们合并在示例代码中,但是有个费用和可维护性的问题。同其它选择不同,该软件不是免费的,并且不完全支持 GIF 标准。

对于清单 3,我们使用 com.sun.image.codec 包,因为它在所有 J2EE 1.2 和 1.3 Web 服务器容器(如 IBM WebSphere 和 Apache Tomcat)中都可用。编码器很简单,并且是 100% 纯 Java 代码,但是它们是 com.sun 包中的。但是,从长远考虑,Java Image I/O 包可能是发展的方向。在图像转换特性以及保存为多种文件格式的能力方面,它比较强大。直到 Java 2 V1.4 时 Java Image I/O 包才会成为标准。

既然已经决定了使用哪个图像处理包,那么保存 JPEG 文件的代码就相当简单了。 ImageSizer 的 encodeJPEG 方法封装了这个过程:

java.awt.image.BufferedImage 对象,这是一个增强的 Java Image 子代,是从重新调整过大小的输出图像创建的。注释在代码中标明了一个位置,可以在这里扩展示例以将徽标、水印、时间戳记或版权信息添加到图像。
在将 Image 转换为 BufferedImage 之后,在输出流上创建一个 JPEGImageEncoder 对象。输出编码质量的范围从 0.0(最差)到 1.0(最佳)。缺省值是 0.75,但 0.95 将生成较大的文件大小,它带有更详细的图像。作为该示例的扩展,您可以考虑由图像大小来决定质量 — 较小的图像需要较高的质量设置,而较大的图像需要较低的设置。
将图像编码到输出流,并对该流进行刷新以确保所有信息都显示在图像文件中。

那就是重新调整图像大小及保存图像所需的全部。

打包并部署到 WebSphere 或 Tomcat 上
本节将阐述如何打包 ImageSizer JSP 标记并将其部署到 Application Server V4.0 或 Apache Tomcat V4.0 上。图 4 显示了 Application Developer 的抓屏。左上栏的 Navigator 窗格(windowpane)显示了 Web 应用程序的目录结构,以及必须如何根据 J2EE 规范打包定制 JSP 标记。由于 J2EE 规范的需要,因此该目录结构对于所有 Web 应用程序都是公共的。一旦归档了该结构,则它将成为 Web 归档(WAR)文件,并且可以方便地将其传送给 WebSphere、Tomcat 或任何其它兼容的 Web 容器。良好的开发环境(如 Application Developer)有助于开发人员遵循这些规范,并生成有效的应用程序。

图 4. 在 WebSphere Studio Application Developer 中打包 ImageSizer
图 4. 在 WebSphere Studio Application Developer 中打包 ImageSizer
图片较大 请放大查看

在 ImageSizer 项目下,有一个源代码目录;开发人员可以选择是否在最终的 WAR 文件中包含该目录。webApplication 目录包含实际的程序代码。示例项目包含名为 PickASize.jsp 的测试 JSP 页面及称为 LazyDog.jpg 的巨大的测试图像。通常, ImageSizer 定制标记的库版本并不包含这些。标记的实现位于 WEB-INF 目录中。Java 类都位于 WEB-INF/classes 中,而标记库描述符(Tag Library Descriptor)文件位于 WEB-INF/tlds 中。这些是所有 Web 应用程序的标准目录布局。该树中的其它文件有助于设置服务器选项,但却并非 WAR 文件强制需要的。使用 Application Developer 或 Java SDK 以创建该应用程序的 WAR 文件。

要将 Web 应用程序部署在 Web Application Server(如 Tomcat)上,则将文件放在 ROOT/webapps 目录中,并且让服务器将 WAR 文件展开为目录结构。对于 Application Server,您可以使用 Administrators Console 中的 Web Application 向导来安装应用程序。部署完毕,可通过访问 http://yourhostname:port/ImageSizer/PickASize.jsp 运行 JSP 页面。

· 结束语

现在您已经创建了自动管理图像缩放的 JSP 定制标记。定制标记为您省去了重新调整图像大小的工作,还使用户在访问您的网站时可以指定自己的首选项。可以很方便地扩充该示例标记以执行各种图像操作:版权文本、时间戳记、徽标或水印。通过将代码部署到 Application Server 或 Apache Tomcat,并且编写一些基于图像的 JSP 页面或使用给定的示例,您可以试验代码。希望本文为您提供了“取出即可用”的 JSP 标记,还提供了能使您进一步扩展功能以满足您需要的代码。愿您看图愉快!

· 参考资料

请下载本文使用的样本代码
请访问IBM WebSphere 开发者园地 以了解更多有关 WebSphere 产品系列的信息,包括本文提到的 WebSphere Application Server。
请通过Apache Software Foundation 网站了解有关 Apache Tomcat 和其它项目的信息。
Advanced JavaServer Pages (Prentice Hall,2001 年)中,David M. Geary 介绍了一种高级的服务器端技术,它可以帮助您充分利用 JSP 技术的能力。Dan Becker 在 IBM 公司的 Software Group(位于得克萨斯州奥斯汀市)工作。目前他在 Denali 和 Interactive Financial Services 项目中从事在线 Web 银行系统工作。在此之前,他负责 IBM Java 2 V1.3 releases AIX、Linux、Operating System/2、System/390 和 Windows 版本中的音频子系统工作。Dan 还从事过 Netscape Navigator for OS/2 中多媒体插件和 OS/2 Warp V4.0 中多媒体部件的工作。

    TAG: 编程

    字号: | 推荐给好友

     

    评分:0

    我来说两句

    seccode