2010-05-30 22 views
5

¿Hay alguna forma de escalar una imagen y luego visualizarla en la página jsp? Cuando recupere y muestre las imágenes, quiero mostrar todas las fotos en el mismo tamaño. ¿Hay alguna API que pueda hacerlo? He buscado desde google, los que encontré trataban de escalar imágenes mediante el uso de tookit pero no funciona en la aplicación web.JSP ¿Cómo escalar una imagen?

Respuesta

4

Puede usar el built-in Java 2D API para esto (tutorial básico de Sun here).

Básicamente, es necesario crear un Servlet que obtiene un InputStream de la imagen original en el método doGet(), pasa a través de la API Java 2D y luego escribe en el OutputStream de la respuesta HTTP. Luego, asigna este servlet a un determinado url-pattern en web.xml, p. /thumbs/* y llame a este servlet en el atributo src del elemento HTML <img>.

Aquí hay un ejemplo básico patada de salida (que todavía tienen que hacer frente a condiciones inesperadas la manera que usted quiere):

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()); 
} 

Con el servlet asignada en web.xml de la siguiente manera:

<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> 

Esto puede ser usado de la siguiente manera:

<img src="thumbs/filename.jpg?w=100&h=100" width="100" height="100"> 

Nota: no, esto no se puede hacer solo con JSP, ya que es una tecnología de visualización inadecuada para esta tarea.


Nota 2: esta es una tarea bastante costosa (intensiva de la CPU), tenga esto en cuenta. Es posible que desee considerar caché o pregenerar los pulgares de antemano usted mismo.

+0

Hice lo mismo, el borde de la imagen solo se muestra en el Excel. ¿Alguna idea? FYI Antes de que especificara el parámetro w y h que mostraba la imagen, pero no con el tamaño especificado. – Palani

0

Nota: no, esto no se puede hacer con JSP solos ya que es una vista de la tecnología inadecuado para esta tarea.

Técnicamente puedes hacerlo, pero de hecho no es algo recomendable.

Y sí, guardaría en caché las imágenes durante mucho tiempo, junto con algo para identificar los cambios en el original, luego recrearé la imagen redimensionada solo si el original cambia (o el caché expira, tal vez una semana después de la imagen fue visitado por última vez).

Cuestiones relacionadas