Как конвертировать BufferedImage в изображение для отображения на JSP - PullRequest
5 голосов
/ 13 марта 2010

Я хотел бы преобразовать BufferedImage в изображение, которое будет отображаться на странице JSP. Как мне этого добиться?

Ответы [ 2 ]

11 голосов
/ 13 марта 2010

Во-первых, JSP - это технология представления, предоставляющая шаблон для записи HTML / CSS / JS и возможность взаимодействия с внутренним Java-кодом для управления потоком страниц и доступа к данным бэкэнда. Ваша проблема больше в HTML.

Теперь, чтобы отобразить изображение на странице HTML, вам нужен элемент HTML <img>. Чтобы определить / выделить изображение, вы просто должны позволить атрибуту src указать URL-адрес. Э.Г.

<img src="url/to/image.jpg">

(это может быть либо относительно текущего контекста, либо абсолютный URL, например, начиная с http://)

Если изображение динамическое, как в вашем случае, вам нужно иметь Servlet, который прослушивает url-pattern, соответствующий URL-адресу изображения. Э.Г.

<img src="imageservlet/image.jpg">

(здесь сервлет, очевидно, должен отображаться на /imageservlet/*, а идентификатор изображения, здесь имя файла, здесь доступен для request.getPathInfo())

<img src> сгенерирует запрос GET, поэтому вам просто нужно реализовать метод doGet() сервлета. Чтобы отправить ответ HTTP, все, что вам нужно сделать, - это записать некоторое содержимое в OutputStream ответа вместе с набором заголовков ответа, представляющих содержимое (Content-Type, Content-Length и / или Content-disposition). Вы можете использовать ImageIO#write(), чтобы записать BufferedImage в OutputStream.

Вы можете найти базовый пример такого сервлета изображения здесь . Вам просто нужно заменить Files#copy() на ImageIO#write().

response.setContentType("image/png");
ImageIO.write(bufferedImage, "png", response.getOutputStream());

Смотри также:

5 голосов
/ 06 апреля 2014

Вам не нужно конвертировать BufferedImage в Image, чтобы отобразить его на странице jsp . Потому что Java 6 JAXB предоставляет javax.xml.bind.DatatypeConverter.printBase64Binary(byte[]) String для преобразования байта [] в base 64 string . Строка base 64 может отображаться с помощью тега <img html , указав исходные данные как base 64, т.е. src="data:image/jpg ;. Вот пример программы, переданной с этого поста .

sample.jsp (тест пройден):

<%@page import="java.awt.image.BufferedImage"%>
<%@page import="javax.imageio.ImageIO"%>
<%@page import="java.io.*"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
BufferedImage bImage = ImageIO.read(new File("/home/visruth/Desktop/Visruth.jpg"));//give the path of an image
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( bImage, "jpg", baos );
baos.flush();
byte[] imageInByteArray = baos.toByteArray();
baos.close();
String b64 = javax.xml.bind.DatatypeConverter.printBase64Binary(imageInByteArray);
%>

<div>
    <p>As of v6, Java SE provides JAXB</p>
    <img src="data:image/jpg;base64, <%=b64%>" alt="Visruth.jpg not found" />
</div>          
</body>
</html>

ИМО, этот подход идеально подходит для небольших изображений, таких как <img src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" width="200" alt="thumbnail" height="200">. В противном случае использование прямого URL-адреса изображения будет хорошо в атрибуте src, например: - <img src="uri-of-image/profile-pic.jpg" width="600" alt="No Profie Pic" height="600">

...