Pregunta

Recibo un NPE al intentar leer en un archivo de imagen, y no puedo por la vida de a averiguar por qué. Aquí está mi línea:

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

imgPath es básicamente garantiza que sea válido y justo antes de que llegue copia el archivo desde el servidor. Cuando llegue a esa línea, consigo este seguimiento de la pila:

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>

Además, este es arrojado a mi ventana de salida:

No se puede crear icofile: No se puede leer bytes: 2

No tengo idea de lo que está pasando, sobre todo porque el constructor del archivo está teniendo éxito. Parece que no puedo encontrar a alguien que ha tenido un problema similar. ¿Alguien tiene ideas? (Java 5 si hay alguna diferencia)

¿Fue útil?

Solución

Me hurgó un poco más y encontré que se puede especificar qué ImageReader ImageIO utilizará y leerlo de esa manera. Metí en torno a nuestra base de código y se encontró que ya teníamos una función en el lugar para hacer exactamente lo que estaba tratando de lograr aquí. Sólo por cualquier otra persona que se encuentra con un problema similar, aquí está el quid del código (parte de la basura se ha definido anteriormente, pero esto debería ayudar a cualquiera que trate de hacerlo):

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);
}

Gracias por las sugerencias y ayudar a todos.

Otros consejos

El constructor de archivos es casi seguro que tenga éxito, independientemente de si se apunta a un archivo válido / existentes . Por lo menos, me gustaría comprobar si existe el archivo subyacente a través del método exists().

Tenga en cuenta también que ImageIO.read no es seguro para subprocesos (reutiliza ImageReaders en caché que no son thread-safe).

Esto significa que no se puede leer fácilmente varios archivos en paralelo. Para hacer eso, usted tiene que tratar con ImageReaders mismo.

Ha considerado que el archivo simplemente puede estar dañado, o que ImageIO está tratando de leerlo como el tipo equivocado de archivo?

Google para los resultados de la clase ICOReader en un hit: IconsFactory de jide-común .
Al parecer tenían el mismo problema:

// 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;
//        }
//    }

¿Qué han hecho en su lugar?

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]));
}

Así que es posible que desee probar el mismo enfoque: leer los bytes sin usar y Toolkit para crear una imagen de ellos.

  

"Es un JPEG, pero no tiene un archivo JPEG   extensión ".

Eso podría ser él.

Parece que la biblioteca AC.lib-ICO está lanzando el NPE. Dado que esta biblioteca está destinada a leer el formato de archivo de Microsoft ICO, JPEG podría ser un problema para él.

Considere proporcionar explícitamente el formato utilizando un método alternativo .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top