【问题标题】:ImageIO.createImageInputStream Keeps Returning nullImageIO.createImageInputStream 不断返回 null
【发布时间】:2011-02-26 23:57:58
【问题描述】:

大家好, 每当我尝试使用ImageIO.createImageInputStream 获取ImageInputStream 对象时,它只会返回null,没有异常、警告或错误。我尝试将不同的数据类型传递给函数,一个简单的File 和一个InputStream,但都返回了null。文档说,如果没有找到合适的ImageInputStreamSpi,那么该函数将返回null,但该文件是沼泽标准JPEG,并且Java 肯定带有开箱即用的这种格式的服务提供商? 感谢您的宝贵时间。

/**
 * Reads in an image from a file and returns the image in a
 * {@code BufferedImage} object.
 *
 * @param source the file to create the {@code BufferedImage}
 * from.
 * @return the {@code BufferedImage} object representing the image
 * in {@code source}.
 */
private BufferedImage readImage( File source ) {
    // There is only one image in this file
    final int imageIndex = 0;
    BufferedImage image = null;

    try {
        // Get the ImageReader object for this filetype
        Iterator readers =
            ImageIO.getImageReaders( source );
        ImageReader reader = (ImageReader) readers.next();

        // Create an ImageInputStream object from the source image file
        ImageInputStream iis = ImageIO.createImageInputStream( source );
        // Raises IllegalArgumentException, because iis is null
        reader.setInput( iis, true );

        // Read the image file
        image = reader.read( imageIndex );
    } catch ( Exception exception ) {
        exception.printStackTrace();
        System.exit( -1 );
    }

    return image;
}

【问题讨论】:

  • 清理您的代码并将其发布在这里以便我们提供帮助:)
  • 除了,你没有回答我的问题,你只是给了我一个我以前已经在使用的不同的解决方案,如下详述......我原来的问题,我仍然有问题,仍未得到答复...
  • 我也有同样的问题。出于某种原因,它可以在 Eclipse 中的 MacOSX 1.6 上运行,但在 debian linux 环境的生产环境中失败。我的应用程序是基于 OSGI 的 Web 应用程序,构建在 Equinox 和 Jetty servlet 容器上。从我目前阅读的所有内容来看,它似乎与 JAI 和 OSGI (stackoverflow.com/questions/1493199/running-jai-in-osgi) 有关。但是我还没有解决。

标签: java javax.imageio


【解决方案1】:

你为什么要这么做?? 你可以这样做:

image = ImageIO.read(source);

没有IteratorsImageInputStreams...没有什么!

编辑:由于您坚持,您的代码不起作用,因为您将File 发送到ImageIO.getImageReaders() 而不是ImageInputStream。所以你的代码应该是这样的:

ImageInputStream iis = ImageIO.createImageInputStream(source);
Iterator readers = ImageIO.getImageReaders(iis);
ImageReader reader = (ImageReader) readers.next();

reader.setInput(iis, false);
image = reader.read(imageIndex);

【讨论】:

  • 我最初使用的是ImageIO.read,但对于大文件,我想添加功能以将观察者添加到我的ImageReader 以跟踪如何大部分文件已被读取。
  • 好的,我已将代码编辑为您所概述的内容,但同样的问题仍然存在; ImageIO.createImageInputStream 只返回 null 而不是有效的 ImageInputStream,所以这是在 ImageIO.getImageReaders 而不是 ImageReader::setInput 中启动 IllegalArgumentException
  • ImageIO.createImageInputStream(Object input) 的 Javadocs 中说“输入应该是一个对象,用作输入源,例如文件、可读的 RandomAccessFile 或 InputStream”。如果输入为null,此方法将抛出IllegalArgumentException!因此,请确保您没有在参数 source 中传递 null。
  • 那是我的问题,source 参数绝对不是null,是图像File,但ImageIO.createImageInputStream 仍然默默返回null 没有引发任何异常,它是任何函数尝试使用ImageInputStream 之后引发异常。我在原始问题中概述了文档如何解释ImageIO.createImageInputStream 返回null。感谢您迄今为止的所有帮助。
猜你喜欢
  • 1970-01-01
  • 2012-05-11
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
相关资源
最近更新 更多