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

Show Image stored in byte array form in java servlet

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

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

但我收到错误消息 "The image cannot be displayed because it contains an error."

实际上原因完全不同 error.I 我分两步执行我的任务 =>

先把image转成byte[]存入hbase。 然后从 hbase 获取 byte[] 并通过浏览器显示它。

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

最初我使用代码

将图像转换为 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();

成功了。