2011-02-26 89 views
5

嘿, 每當我試着用ImageIO.createImageInputStream它只是返回null沒有例外,警告或錯誤,以得到一個ImageInputStream對象。我曾嘗試將不同的數據類型傳遞給函數,簡單的FileInputStream,但都返回null也。該文檔說,如果找不到合適的ImageInputStreamSpi,那麼該函數將返回null,但該文件是一個bog標準的JPEG格式,並且肯定Java會隨服務提供商提供這種開箱即用的格式? 謝謝你的時間。ImageIO.createImageInputStream保持返回NULL

/** 
* 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; 
} 
+0

以及清潔你的代碼,並張貼在這裏,所以我們可以幫助:) – FearUs 2011-02-27 00:13:10

+0

除此之外,你沒有回答我的問題,你只要給我一個不同的解決方案,我是已在使用之前,詳細如下...我的原始問題,我仍然遇到麻煩,仍然沒有答案... – 2011-02-27 09:42:38

+0

我有同樣的問題。由於某種原因,它可以在Eclipse中在MacOSX 1.6上運行,但是在Debian Linux環境下生產失敗。我的應用程序是建立在Equinox和Jetty servlet容器上的基於OSGI的web應用程序。從我讀到目前爲止,它似乎與JAI和OSGI(http://stackoverflow.com/questions/1493199/running-jai-in-osgi)有關。但我還沒有解決它。 – Christoph 2012-07-08 15:37:53

回答

3

你爲什麼要這麼做? 你可以簡單地這樣做:

image = ImageIO.read(source); 

沒有IteratorsImageInputStreams ......什麼都沒有!

編輯:既然你堅持,你的代碼是不工作,因爲你發送一個FileImageIO.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); 
+0

我最初使用的是'ImageIO.read',但對於大文件而言,當讀取大圖時,我不想拖延,而是想添加觀察者到我的ImageReader中的功能,以跟蹤文件的大小被讀過。 – 2011-02-27 09:33:13

+0

好的,我已經編輯了我所描述的代碼,但同樣的問題仍然存在; 'ImageIO.createImageInputStream'只是返回'null'而不是有效的'ImageInputStream',所以這會在'ImageIO.getImageReaders'中踢出一個'IllegalArgumentException',而不是在'ImageReader :: setInput'中。 – 2011-02-27 22:22:10

+0

從'ImageIO.createImageInputStream(Object input)'的Javadocs中'它說「輸入應該是一個要用作輸入源的對象,例如文件,可讀的RandomAccessFile或InputStream。如果輸入爲'null',此方法將引發'IllegalArgumentException'!所以確保你沒有在參數'source'中傳遞null。 – FearUs 2011-02-28 01:12:58