【问题标题】:How to convert BufferedImage to image to display on JSP如何将 BufferedImage 转换为图像以在 JSP 上显示
【发布时间】:2010-03-13 12:52:11
【问题描述】:

我想将BufferedImage 转换为将在JSP 页面上显示的图像。我怎样才能做到这一点?

【问题讨论】:

  • BuferedImage 的父类是Image。你能说得更具体点吗?
  • 是的,请提供更多信息。你哪里有这张图?一种可能的方法是使用 Servlet,它将 BufferedImage 写入响应,并在 JSP 页面上编写指向该 servlet 的链接。不久,听起来不错,但我不确定它是否涵盖您的情况...

标签: image jsp bufferedimage


【解决方案1】:

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

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

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

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

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

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

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

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

您可以找到此类图像 servlet here 的基本示例。您只需将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);

最后使用data URI scheme在转发的JSP中显示如下:

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

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


另见:

【讨论】:

    【解决方案2】:

    您无需将BufferedImage 转换为Image 即可在jsp 页面上显示它。因为,Java 6 JAXB 提供 javax.xml.bind.DatatypeConverter.printBase64Binary(byte[]) Stringbyte[] 转换为 base 64 字符串base 64 字符串 可以使用&lt;img html 标记通过将源数据指定为base 64src="data:image/jpg; 来显示。这是this post引用的示例程序。

    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,这种方法非常适合像 &lt;img src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" width="200" alt="thumbnail" height="200"&gt; 这样的小尺寸图像。否则在src 属性中使用图片的直接网址就可以了,例如:-&lt;img src="uri-of-image/profile-pic.jpg" width="600" alt="No Profie Pic" height="600"&gt;

    【讨论】:

    • 谢谢您的回答。
    • @Md.NaushadAlam 这是我的荣幸!
    • 在这一行ImageIO.write( bImage, "jpg", baos ); 上,无论如何您都将缓冲图像转换为图像。
    • 它正在将jpg 图像字节写入baos 数组。
    • Image 是 Java 中的另一个类,这就是为什么我说“您无需将 BufferedImage 转换为 Image
    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多