Apache-Commons Sanselan AIOOBE al descomprimir PackBits TIFF

ArrayIndexOutOfBoundsException lista para usar al intentar usar Apache-Commons Sanselan para cargar un TIFF comprimido con compresión PackBits.

Código:

import org.apache.sanselan.*;

public class TIFFHandler {
    public static Image loadTIFF(String fileName) throws ImageReadException, IOException {
        File imageFile = new File(fileName);
        BufferedImage bi = Sanselan.getBufferedImage(imageFile);
        return bi;
    }

    public static void main(String[] args) throws IOException, ImageReadException {
        String TIFFFILE = "test_image.tif";
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        BufferedImage bi = (BufferedImage) loadTIFF(TIFFFILE);
        ImageIcon ii = new ImageIcon(bi);
        JLabel lbl = new JLabel(ii);
        panel.add(lbl);
        frame.setVisible(true);
    }
}

Stack trace:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 426
at org.apache.sanselan.common.PackBits.decompress(PackBits.java:55)
at org.apache.sanselan.formats.tiff.datareaders.DataReader.decompress(DataReader.java:127)
at org.apache.sanselan.formats.tiff.datareaders.DataReaderStrips.readImageData(DataReaderStrips.java:96)
at org.apache.sanselan.formats.tiff.TiffImageParser.getBufferedImage(TiffImageParser.java:505)
at org.apache.sanselan.formats.tiff.TiffDirectory.getTiffImage(TiffDirectory.java:163)
at org.apache.sanselan.formats.tiff.TiffImageParser.getBufferedImage(TiffImageParser.java:441)
at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1264)
at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1255)
at TIFFHandler.loadTIFF(FieldSheetHandler.java:42)
at TIFFHandler.main(FieldSheetHandler.java:90)

Intenté un análisis del problema, pero estoy bastante perdido... cualquier dirección sería realmente útil. Las imágenes TIFF son un dolor en el culo **.

preguntado el 22 de mayo de 12 a las 21:05

¿Probaste con el código del maletero? Commons Sanselan (que pasará a llamarse Commons Imaging) ha cambiado mucho últimamente a medida que avanza hacia la versión 1.0. -

Estoy usando el archivo .JAR más reciente (sanselan-0.97.incubator.jar), ¿es este el código troncal? No parece haber una diferenciación troncal/rama... -

No, tiene 3 años. Puede obtener los archivos jar de compilación nocturnos del repositorio de instantáneas de Apache: repositorio.apache.org/content/groups/snapshots/org/apache/… -

¡Maravilloso! Esto soluciona principalmente mis problemas (aceptaré una respuesta si publica una). Además, ¿hay un Javadoc actualizado para Commons-imaging? Necesito una forma de cargar una subimagen específica de un TIFF sin cargar todas las subimágenes (debido a limitaciones de memoria)... -

1 Respuestas

Puede probar la versión actualizada de Commons Imaging desde el repositorio de instantáneas de Apache. El Javadoc aún no está en línea, tendrá que compilarlo antes de revisando el código de SVN y funcionando mvn javadoc:javadoc.

Si encuentra más problemas o desea sugerir una mejora, puede archivarlos en JIRA. Además, los desarrolladores estarán encantados de ayudarle si tiene preguntas sobre el uso de la API. te esperan en el lista de envío.

contestado el 23 de mayo de 12 a las 15:05

Gracias por esto; es exactamente lo que necesitaba! Pude crear un nuevo método para obtener solo la imagen almacenada en búfer que quiero, en lugar de la primera o todas. - bencole

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.