在我们浏览网页的时候,经常会看到一些较小的图片,它们的实际尺寸可能要比显示的尺寸大得多。
在Web 开以中,有很多需求都要求显示图像的缩略图,可能是由于版面的限制,也有可能是功能设计的需要。
例如,一个图片网站为了用户方便浏览图片,在一个页面中显示几十,幅图片的缩略图,当用户单击缩略图时,
再显示正常的图片.
现在本人就来介绍如何对一幅图片时缩放。
实例开发主要有下列步骤/
Step1 编写PicZoom.java
picZoom是一个工具类,用于对图像进行缩放,它提供了两个静态方法。根据指定的输出大小图像进行缩放。其中一个方法接受图像文件
的文件名,另一个方法接受java.awtImage对象。
<<<<<<<<PicZoom.java的代码示例>>>>>>>>>>>>
package programmer;
import java.awt.Color;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
import javax.swing.ImageIcon;
public class PicZoom {
public static BufferedImage zoom(String srcFileName, int outputWidth,
int outputHeight) {
//使用图像源文件名创建ImageIcon对像
ImageIcon imgIcon = new ImageIcon(srcFileName);
//得到Image对象
Image img = imgIcon.getImage();
return zoom(img, outputWidth, outputHeight);
}
public static BufferedImage zoom(Image srcImage, int outputWidth,
int outputHeight) {
//构造一个预定义的图像类型的BufferedImage对象
BufferedImage buffImg = new BufferedImage(outputWidth, outputHeight,
BufferedImage.TYPE_INT_RGB);
//创建Graphics2D对象,用于在BufferedImage对象上绘图
Graphics2D g = buffImg.createGraphics();
//设置图形上下文的当前颜色为白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, outputWidth, outputHeight);
//按照缩放的大小在BufferedImage对象上绘制原始图像
g.drawImage(srcImage, 0, 0, outputWidth, outputHeight, null);
//释放图形上下文使用的系统资源的。
g.dispose();
return buffImg;
}
}
Step2 编定ImageHandlerServlet.java
这个Servlet类根据客户端请求的图片ID号,调用 PicZoom 类的zoom()方法缩小图像,然后向客户端输出图像的缩略图。
<<<<<<<<ImageHandlerServlet.java>>>>>>>>>>>>
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import programmer.PicZoom;
import com.sun.image.codec.jpeg.*;
import java.awt.image.BufferedImage;
public class ImageHandlerServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
String strId = request.getParameter("id");
if (null == strId || "".equals(strId)) {
throw new ServletException("图像参数错误");
}
int id = Integer.parseInt(strId);
String srcImgFileName = null;
/*
此处为简单,所以使用了switch/case语句,硬编码了1.jpg这幅图片,
读者可以将图片数据保存到数据库中,根据请求的参数取出相应的图片.
或者直接保存在硬盘上,为所有的图片文件做一个索引文件
得到请求参数后,通过查找索引文件得到图片的路径。
**/
switch (id) {
case 1:
srcImgFileName = getServletContext().getRealPath("/Image/1.jpg");
break;
case 2:
break;
default:
throw new ServletException("图像参数错误");
}
response.setContentType("image/jpeg");
ServletOutputStream sos = response.getOutputStream();
//调 用PicZoom 类的静态方法Zoom 对原始图像时行缩放。
BufferedImage buffImg = PicZoom.zoom(srcImgFileName, 80, 80);
//创建JPEG图像编码器,用于编码内存中的图像数据到JPEG数据输出流。
JPEGImageEncoder jpgEncoder = JPEGCodec.createJPEGEncoder(sos);
// 编码BufferedImage对象到 JPEG数据输入流
jpgEncoder.encode(buffImg);
sos.close();
}
}
在这个类中,我们判断如果请求参数错误,则抛出ServletException异常。
step3:编 写image.jsp
这个页面用于显示图像的缩略图。
<<<<<<<<image.jsp>>>>>>>>>>>>
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
image
</title>
</head>
<body bgcolor="#ffffff">
<h1>
JBuilder Generated JSP
</h1>
<a href="image1.jsp"><img alt="点击小图片看大图片" src="image?id=1" /></a>
</body>
</html>
因为image页面只是用于测式图像缩放的功能是否完成,所以图像的URL后附的ID参数值是硬编码的,实际应用时。根据服务器图像文件的编号
来动态产生ID值
Step4编写Show.jsp
这个页面用于显示正常图片
<<<<<<<<show.jsp>>>>>>>>>>>>
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
image1
</title>
</head>
<body bgcolor="#ffffff">
<h1>
JBuilder Generated JSP
</h1>
<img alt="fd" src="Image/1.jpg" width="400" height="500"/>
</body>
</html>
step5:部署Servlet
<servlet>
<servlet-name>imagehandlerservlet</servlet-name>
<servlet-class>programmer.ImageHandlerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>imagehandlerservlet</servlet-name>
<url-pattern>/image</url-pattern>
</servlet-mapping>