1

我在尝试读取图像文件时遇到了 NPE,我终生无法弄清楚原因。这是我的台词:

BufferedImage source = ImageIO.read(new File(imgPath));

imgPath 基本上保证是有效的,并且在它到达这里之前它会从服务器复制文件。当它到达那条线时,我得到了这个堆栈跟踪:

Exception in thread "Thread-26" java.lang.NullPointerException
    at com.ctreber.aclib.image.ico.ICOReader.getICOEntry(ICOReader.java:120)
    at com.ctreber.aclib.image.ico.ICOReader.read(ICOReader.java:89)
    at javax.imageio.ImageIO.read(ImageIO.java:1400)
    at javax.imageio.ImageIO.read(ImageIO.java:1286)
    at PrintServer.resizeImage(PrintServer.java:981)    <---My function
    <Stack of rest of my application here>

此外,这被扔到我的输出窗口中:

无法创建 ICOFile:无法读取字节:2

我不知道发生了什么,特别是因为 File 构造函数成功了。我似乎找不到任何有类似问题的人。有人有什么想法吗?(如果这有什么不同的话,Java 5)

4

6 回答 6

2

我又摸索了一些,发现您可以指定 ImageReader ImageIO 将使用哪个并以这种方式读取它。我浏览了我们的代码库,发现我们已经有了一个功能,可以完全按照我在这里想要完成的工作。对于遇到类似问题的其他人,这里是代码的症结所在(上面定义了一些废话,但这应该有助于任何尝试这样做的人):

File imageFile = new File(filename);
Iterator<ImageReader> imageReaders = ImageIO.getImageReadersByFormatName("jpeg");
if ( imageReaders.hasNext() ) {
    imageReader = (ImageReader)imageReaders.next();
    stream = ImageIO.createImageInputStream(imageFile);
    imageReader.setInput(stream, true);
    ImageReadParam param = imageReader.getDefaultReadParam();
    curImage = imageReader.read(0, param);
}

感谢大家的建议和帮助。

于 2009-05-18T17:02:07.750 回答
1

File 构造函数几乎肯定会成功,无论它是否指向有效/现有的文件。至少,我会通过该exists()方法检查您的基础文件是否存在。

于 2009-05-18T16:27:54.213 回答
1

另请注意,这ImageIO.read不是线程安全的(它重用缓存ImageReader的不是线程安全的)。

这意味着您不能轻松地并行读取多个文件。为此,您必须ImageReader自己处理 s。

于 2013-04-15T10:13:41.900 回答
0

您是否考虑过文件可能只是损坏了,或者 ImageIO 试图将其作为错误类型的文件读取?

于 2009-05-18T16:21:57.753 回答
0

谷歌搜索 ICOReader 类会得到一击:IconsFactory来自jide-common
显然他们有同样的问题:

// Using ImageIO approach results in exception like this.
//    Exception in thread "main" java.lang.NullPointerException
//            at com.ctreber.aclib.image.ico.ICOReader.getICOEntry(ICOReader.java:120)
//            at com.ctreber.aclib.image.ico.ICOReader.read(ICOReader.java:89)
//            at javax.imageio.ImageIO.read(ImageIO.java:1400)
//            at javax.imageio.ImageIO.read(ImageIO.java:1322)
//            at com.jidesoft.icons.IconsFactory.b(Unknown Source)
//            at com.jidesoft.icons.IconsFactory.a(Unknown Source)
//            at com.jidesoft.icons.IconsFactory.getImageIcon(Unknown Source)
//            at com.jidesoft.plaf.vsnet.VsnetMetalUtils.initComponentDefaults(Unknown Source)

//    private static ImageIcon createImageIconWithException(final Class<?> baseClass, final String file) throws IOException {
//        try {
//            InputStream resource =
//                    baseClass.getResourceAsStream(file);
//            if (resource == null) {
//                throw new IOException("File " + file + " not found");
//            }
//            BufferedInputStream in =
//                    new BufferedInputStream(resource);
//            return new ImageIcon(ImageIO.read(in));
//        }
//        catch (IOException ioe) {
//            throw ioe;
//        }
//    }

他们做了什么?

private static ImageIcon createImageIconWithException(
        final Class<?> baseClass, final String file)
        throws IOException {
    InputStream resource = baseClass.getResourceAsStream(file);

    final byte[][] buffer = new byte[1][];
    try {
        if (resource == null) {
            throw new IOException("File " + file + " not found");
        }
        BufferedInputStream in = new BufferedInputStream(resource);
        ByteArrayOutputStream out = new ByteArrayOutputStream(1024);

        buffer[0] = new byte[1024];
        int n;
        while ((n = in.read(buffer[0])) > 0) {

            out.write(buffer[0], 0, n);
        }
        in.close();
        out.flush();
        buffer[0] = out.toByteArray();
    } catch (IOException ioe) {
        throw ioe;
    }

    if (buffer[0] == null) {
        throw new IOException(baseClass.getName() + "/" + file
                + " not found.");
    }
    if (buffer[0].length == 0) {
        throw new IOException("Warning: " + file
                + " is zero-length");
    }

    return new ImageIcon(Toolkit.getDefaultToolkit().createImage(
            buffer[0]));
}

因此,您可能想尝试相同的方法:读取原始字节并使用Toolkit它们创建图像。

于 2009-05-18T16:39:56.530 回答
0

“这是一个 jpeg,但没有 jpeg 扩展名。”

可能就是这样。

看来AC.lib-ICO库正在抛出 NPE。由于此库旨在读取 Microsoft ICO 文件格式,因此 JPEG 可能是它的问题。

考虑使用替代方法显式提供格式。

于 2009-05-18T16:57:26.527 回答