JSP如何缩放图像?

时间:2010-05-30 12:55:08

标签: java jsp servlets image-scaling

无论如何缩放图像然后在jsp页面中显示?检索并显示图像时,我想显示所有相同尺寸的照片。是否有任何API可以做到这一点?我从谷歌搜索过,我发现的是关于使用takeit缩放图像但在网络应用程序中无效。

2 个答案:

答案 0 :(得分:4)

您可以使用内置Java 2D API(基本的Sun教程here)。

基本上,您需要创建Servlet,在InputStream方法中获取原始图像的doGet(),将其传递给Java 2D API,然后将其写入{ HTTP响应的{1}}。然后,您只需将此Servlet映射到OutputStream中的某个url-pattern,例如web.xml并在HTML /thumbs/*元素的src属性中调用此Servlet。

这是一个基本的启动示例(您仍然需要自己按照自己的方式处理意外情况):

<img>

将servlet映射到protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // First get image file name as request pathinfo (or parameter, whatever you want). String imageFilename = request.getPathInfo().substring(1); // And get the thumbnail dimensions as request parameters as well. int thumbWidth = Integer.parseInt(request.getParameter("w")); int thumbHeight = Integer.parseInt(request.getParameter("h")); // Then get an InputStream of image from for example local disk file system. InputStream imageInput = new FileInputStream(new File("/images", imageFilename)); // Now scale the image using Java 2D API to the desired thumb size. Image image = ImageIO.read(imageInput); BufferedImage thumb = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = thumb.createGraphics(); graphics2D.setBackground(Color.WHITE); graphics2D.setPaint(Color.WHITE); graphics2D.fillRect(0, 0, thumbWidth, thumbHeight); graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null); // Write the image as JPG to the response along with correct content type. response.setContentType("image/jpeg"); ImageIO.write(thumb, "JPG", response.getOutputStream()); } ,如下所示:

web.xml

可以使用如下:

<servlet>
    <servlet-name>thumbServlet</servlet-name>
    <servlet-class>com.example.ThumbServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>thumbServlet</servlet-name>
    <url-pattern>/thumbs/*</url-pattern>        
</servlet-mapping>

注意:不,这不能单独使用JSP,因为它是一种不适合此任务的视图技术。


注意2:这是一项非常昂贵的(CPU密集型)任务,请记住这一点。您可能需要考虑事先自己缓存或预生成拇指。

答案 1 :(得分:0)

  

注意:不,这不能用JSP完成   因为它是一种视图技术   不适合这项任务。

从技术上讲,你可以做到这一点,但实际上这不是明智之举。

是的,我会长时间缓存图像,同时识别对原始图像的更改,然后只有在原始更改(或缓存过期,可能是图像后一周)后才重新创建已调整大小的图像最后访问过。)