2010-05-30 2 views
5

Есть ли какой-либо способ масштабирования изображения, а затем отображение на странице jsp? Когда вы извлекаете и показываете изображения, я хочу показать все фотографии одного размера. есть ли какой-либо API-интерфейс? Я искал из google, те, что я нашел, касались масштабирования изображений, используя takeit, но не могут работать в веб-приложении.JSP Как масштабировать изображение?

ответ

4

Вы можете использовать встроенный Java 2D API для этого (основной учебник Sun here).

В принципе, вам нужно создать Servlet, который получает InputStream исходного изображения в методе doGet(), передает его через Java 2D API, а затем записывает его в OutputStream ответа HTTP. Затем вы просто наведите этот сервлет на определенный url-pattern в web.xml, например. /thumbs/* и назовите этот сервлет в атрибуте src элемента HTML <img>.

Вот простой пример стартового (вам все еще нужно обрабатывать неожиданные условия себя так, как вы хотите):

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> 

Это может быть используется следующим образом:

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

Примечание: нет, это невозможно сделать с JSP, так как это технология просмотра, непригодная для этой задачи.


Примечание 2: Это довольно дорогостоящая (интенсивная работа с ЦП) задача, помните об этом. Возможно, вы захотите рассмотреть возможность кэширования или предварительного форматирования пальцев заранее.

+0

Я сделал то же самое, изображение границы отображалось только в excel. Любая идея? FYI Прежде чем указать параметры w и h, изображение отображалось, но не с указанным размером. – Palani

0

Примечание: нет, это не может быть сделано с JSP только поскольку это вид технологии непригодны для решения этой задачи.

Технически вы можете это сделать, но на самом деле это не то, что желательно.

И да, я бы долго кешировал изображения вместе с чем-то, чтобы идентифицировать изменения оригинала, а затем воссоздать измененное изображение только в том случае, если исходные изменения (или срок действия кеша истекает, может быть, через неделю после изображения был в последний раз доступ).

Смежные вопросы