5

I would like to convert BufferedImage to an image that will display on JSP page. How can I achieve this?

4

2 回答 2

11

首先,JSP 是一种视图技术,提供用于编写​​ HTML/CSS/JS 的模板以及与后端 Java 代码交互以控制页面流和访问后端数据的能力。您的问题更多是在 HTML 中。

现在,要在 HTML 页面中显示图像,您需要 HTML<img>元素。要定义/分配图像,您只需让src属性指向一个 URL。例如

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

(它可以是相对于当前上下文的,也可以是绝对 URL,例如以 开头http://

如果图像是动态的,就像您的情况一样,您需要一个Servletwhich 侦听url-pattern匹配的图像 URL。例如

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

(这里的 servlet 显然要映射到 的 URL 模式上,/imageservlet/*并且图像标识符,这里是文件名,可以通过 获取request.getPathInfo()

<img src>触发 GET 请求,因此您只需实现doGet()servlet 的方法。要发送 HTTP 响应,您需要做的就是将一些内容写入OutputStream响应的 ,以及一组表示内容的响应标头(Content-TypeContent-Length/或Content-disposition)。您可以使用ImageIO#write()将 aBufferedImage写入OutputStream.

您可以在此处找到此类图像 servlet 的基本示例。您只需替换Files#copy()ImageIO#write().

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

作为一种完全不同的选择,您还可以让 servlet 将图像转换为 Base64 编码的字符串并将其传递给 JSP:

ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", output);
String imageAsBase64 = Base64.getEncoder().encodeToString(output.toByteArray());
request.setAttribute("imageAsBase64", imageAsBase64);
request.getRequestDispatcher("/WEB-INF/some.jsp").forward(request, response);

最后使用如下的数据 URI 方案在转发的 JSP 中显示它:

<img src="data:image/png;base64,${imageAsBase64}" />

您只需要记住,这不会给服务器或客户端缓存图像的机会。因此,如果图像不是临时的,这种方法效率很低。


也可以看看:

于 2010-03-13T13:40:38.340 回答
6

您无需转换 BufferedImage为在jsp页面Image上显示它。因为,Java 6 JAXB 提供将byte[] in 转换为base 64 string。通过将源数据指定为ie ,可以使用html标签显示base 64 字符串。这是这篇文章中提到的示例程序。javax.xml.bind.DatatypeConverter.printBase64Binary(byte[]) String<img base 64src="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>

IMO,这种方法非常适合像<img src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" width="200" alt="thumbnail" height="200">. src否则在属性中使用图像的直接 url 就可以了,例如:-<img src="uri-of-image/profile-pic.jpg" width="600" alt="No Profie Pic" height="600">

于 2014-04-06T08:55:49.223 回答