【问题标题】:null returned while converting data array to ImageInputStream将数据数组转换为 ImageInputStream 时返回 null
【发布时间】:2014-06-03 14:48:19
【问题描述】:

我不明白为什么 bigInputStream 为空,即使 data 设置得很好。

    InputStream in = new ByteArrayInputStream(data);
    BufferedImage bufferedImage;
    bufferedImage = ImageIO.read(in);
    // next instruction has problem
    ImageInputStream bigInputStream = ImageIO.createImageInputStream(bufferedImage);
    Iterator<ImageReader> iter = ImageIO.getImageReaders(bigInputStream);
    if (!iter.hasNext()) {
        // thow exception here
    }
    ImageReader reader = iter.next();

【问题讨论】:

  • 错误信息是什么?
  • @AnubianNoob 使用 Debug,我发现 bigInputStream 实例等于 null。没有抛出异常。
  • @DmitryGinzburg .. 不是真正的重复。在该链接中,它将 File 转换为 ImageInputStream 而不是数据数组。
  • 你想用图像输入流部分做什么?我看到你从一个从字节数组创建的缓冲图像开始,然后你在做什么(大图)?

标签: java image


【解决方案1】:

为了尝试回答这个问题,有问题的行是(正如 OP 自己指出的那样):

ImageInputStream bigInputStream = ImageIO.createImageInputStream(bufferedImage);

(小字:理论上这是可行的,但它需要自定义服务提供者可以从您已经加载到内存中的图像中读取图像数据,这似乎有点奇怪)。

应该是这样的:

ImageInputStream bigInputStream = ImageIO.createImageInputStream(in);

即:ImageInputStreamImageReaders 的辅助类,用于从 FileInputStreamFileChannel 等读取二进制数据。它不适用于从已构建的图像中读取数据。

修复后,您的代码可能如下所示:

InputStream in = new ByteArrayInputStream(data);
ImageInputStream bigInputStream = ImageIO.createImageInputStream(in);

Iterator<ImageReader> iter = ImageIO.getImageReaders(bigInputStream);
if (!iter.hasNext()) {
    // thow exception here
}
ImageReader reader = iter.next();

BufferedImage bufferedImage = reader.read(0); // Read the first image in the file

// Do other tings with reader, like getting the file format
String format = reader.getFormatName();
...

reader.dispose(); // Should be done in finally block, but I leave that out

【讨论】:

    【解决方案2】:

    在这里,我在this link 找到的完美工作方法:

    private static String determineImageFormat( byte[] imageBytes ) throws IOException {
    
      final ByteArrayInputStream bStream = new ByteArrayInputStream( imageBytes );
    
      final ImageInputStream imgStream = ImageIO.createImageInputStream( bStream );
      final Iterator<ImageReader> iter = ImageIO.getImageReaders( imgStream );
    
      final ImageReader imgReader = iter.next();
    
      return imgReader.getFormatName();
    

    }

    可能应该添加一些验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      相关资源
      最近更新 更多