在java servlet中显示以字节数组形式存储的图像

时间:2015-03-17 12:20:01

标签: java image servlets

我将图片存储为byte[]。现在我想从Java servlet中显示它。我正在使用此代码:

response.setContentType("image/gif");
OutputStream out = response.getOutputStream();
out.write(img); // image is of byte[] type.
out.flush();
out.close();

但是我收到错误“图片无法显示,因为它包含错误。”

1 个答案:

答案 0 :(得分:1)

实际上这个错误的原因完全不同。我正在分两步执行我的任务=>

首先将图像转换为byte[]并存储到hbase中。 然后从hbase获取byte[]并通过浏览器显示它。

在问题中我提到了第二部分的代码,但导致错误的实际问题在第1部分。错误的原因是:

最初我使用代码

将图像转换为byte[]
    File imgPath = new File(ImageName);
    BufferedImage bufferedImage = ImageIO.read(imgPath);

    // get DataBufferBytes from Raster
    WritableRaster raster = bufferedImage.getRaster();
    DataBufferByte data = (DataBufferByte) raster.getDataBuffer();

    return (data.getData());

导致错误的原因

"Exception in thread "main" java.lang.IllegalArgumentException: image == null!
    at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
    at javax.imageio.ImageIO.getWriter(ImageIO.java:1591)
    at javax.imageio.ImageIO.write(ImageIO.java:1520)
    at com.medianet.hello.HbaseUtil.main(HbaseUtil.java:138)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
"

当我将代码更改为

    ByteArrayOutputStream baos=new ByteArrayOutputStream();
    BufferedImage img=ImageIO.read(new File(ImageName));
    ImageIO.write(img, "jpg", baos);
    baos.flush();

    return baos.toByteArray();

有效。