I would like to convert BufferedImage
to an image that will display on JSP page. How can I achieve this?
2 回答
首先,JSP 是一种视图技术,提供用于编写 HTML/CSS/JS 的模板以及与后端 Java 代码交互以控制页面流和访问后端数据的能力。您的问题更多是在 HTML 中。
现在,要在 HTML 页面中显示图像,您需要 HTML<img>
元素。要定义/分配图像,您只需让src
属性指向一个 URL。例如
<img src="url/to/image.jpg" />
(它可以是相对于当前上下文的,也可以是绝对 URL,例如以 开头http://
)
如果图像是动态的,就像您的情况一样,您需要一个Servlet
which 侦听url-pattern
匹配的图像 URL。例如
<img src="imageservlet/image.jpg" />
(这里的 servlet 显然要映射到 的 URL 模式上,/imageservlet/*
并且图像标识符,这里是文件名,可以通过 获取request.getPathInfo()
)
将<img src>
触发 GET 请求,因此您只需实现doGet()
servlet 的方法。要发送 HTTP 响应,您需要做的就是将一些内容写入OutputStream
响应的 ,以及一组表示内容的响应标头(Content-Type
和Content-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}" />
您只需要记住,这不会给服务器或客户端缓存图像的机会。因此,如果图像不是临时的,这种方法效率很低。
也可以看看:
您无需转换 BufferedImage
为在jsp页面Image
上显示它。因为,Java 6 JAXB 提供将byte[] in 转换为base 64 string。通过将源数据指定为ie ,可以使用html标签显示base 64 字符串。这是这篇文章中提到的示例程序。javax.xml.bind.DatatypeConverter.printBase64Binary(byte[]) String
<img
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>
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">