Pregunta

Estoy usando JAI y creo un archivo con:

PlanarImage img = JAI.create("fileload", myFilename);

Compruebo antes de esa línea si el archivo existe.Pero, ¿cómo puedo comprobar si el archivo es .bmp, .tiff o un archivo de imagen?

¿Alguien sabe?

¿Fue útil?

Solución

El proyecto Image Magick tiene funciones para identificar imágenes y hay un contenedor de Java para Image Magick llamado JMagick que creo que quizás quieras considerar en lugar de reinventar la rueda:

http://www.jmagick.org

Estoy usando Image Magick todo el tiempo, incluida su función de "identificar" desde la línea de comando y nunca falló al identificar una imagen.

En los días en los que necesitaba absolutamente esa función y JMagick aún no existía, solía Runtime.exec() ImagenMagick's identify comando de Java y funcionó perfectamente.

Hoy en día que existe JMagick, esto probablemente ya no sea necesario (pero aún no he probado JMagick).

Tenga en cuenta que proporciona mucho más que sólo el formato, por ejemplo:

$  identify tmp3.jpg 
tmp3.jpg JPEG 1680x1050 1680x1050+0+0 DirectClass 8-bit 293.582kb 

$  identify tmp.png
tmp.png PNG 1012x900 1012x900+0+0 DirectClass 8-bit 475.119kb

Otros consejos

Trate de usar el ancho de la imagen:

boolean isImage(String image_path){
  Image image = new ImageIcon(image_path).getImage();
  if(image.getWidth(null) == -1){
        return false;
  }
  else{
        return true;
  }
}

si la anchura es de -1 a continuación, no es una imagen.

Para saber si algo es un png, he utilizado este fragmento a continuación en Java Android.

public CompressFormat getCompressFormat(Context context, Uri fileUri) throws IOException {
    // create input stream
    int numRead;
    byte[] signature = new byte[8];
    byte[] pngIdBytes = { -119, 80, 78, 71, 13, 10, 26, 10 };
    InputStream is = null;

    try {
        ContentResolver resolver = context.getContentResolver();
        is = resolver.openInputStream(fileUri);

        // if first 8 bytes are PNG then return PNG reader
        numRead = is.read(signature);

        if (numRead == -1)
            throw new IOException("Trying to reda from 0 byte stream");

    } finally {
        if (is != null)
            is.close();
    }

    if (numRead == 8 && Arrays.equals(signature, pngIdBytes)) {
        return CompressFormat.PNG;
    }

    return null;
}

A principios de los archivos, hay una secuencia de caracteres que identifican. Por ejemplo archivos JPEG comienza con FF FF D8.

Puede comprobar si esta secuencia en su programa, pero no estoy seguro de si esto funciona para cada archivo.

Para obtener información sobre la identificación de caracteres que se pueden echar un vistazo a http://filext.com

DROID , una herramienta para el archivo identificación formato que también ofrece una API de Java, que se utilizará más o menos así:

AnalysisController controller = new AnalysisController();
controller.readSigFile(signatureFileLocation);
controller.addFile(fileToIdentify.getAbsolutePath());
controller.runFileFormatAnalysis();
Iterator<IdentificationFile> it = controller.getFileCollection().getIterator();

Documentación sobre el uso de la API es más bien escasa, pero se puede echar un vistazo a este ejemplo de trabajo (la parte interesante es en el método identifyOneBinary).

La única manera confiable (semi) para determinar el contenido de un archivo es abrirlo y leer los primeros caracteres. A continuación, puede utilizar un conjunto de pruebas tales como se aplica en el comando de archivos de Unix para hacer una conjetura en cuanto a los contenidos del archivo.

Ampliando la respuesta de Birkan, hay una lista de 'números mágicos' disponible aquí:

http://www.astro.keele.ac .uk / oldusers / RNO / Computación / File_magic.html

Me acaba de comprobar un archivo BMP y TIFF (ambos acaba de crear en Windows XP / de la pintura), y que parece ser correcta:

First two bytes "42 4d" -> BMP
First four bytes "4d 4d 00 2a" -> TIFF

He utilizado VIM para editar los archivos y luego hice Herramientas | Convertir a hexadecimal, pero también se puede utilizar 'od -c' o algo similar para comprobar ellos.

Como completa a un lado, yo estaba un poco divertido cuando me enteré de los números mágicos utilizados para las clases Java compiladas: 'Ca Fe Ba Be' - 'café nena':)

Trate de usar la JavaBeans Activation Framework norma (JAF)

Con la extensión estándar JavaBeans Activation Framework, los desarrolladores que utilizan la tecnología Java puede aprovechar los servicios estándar a determinar el tipo de una pieza arbitraria de datos , el acceso encapsulado a ella, descubrir las operaciones de disposición , y para instanciar el bean apropiado para llevar a cabo dicha operación (s). Por ejemplo, si un navegador obtiene una imagen JPEG, este marco permitiría el navegador para identificar a esa corriente de datos como una imagen JPEG , ya partir de ese tipo, el navegador podría localizar y crear una instancia de un objeto que podría manipular o ver esa imagen.

if(currentImageType ==null){
                    ByteArrayInputStream is = new ByteArrayInputStream(image);
                    String mimeType = URLConnection.guessContentTypeFromStream(is);
                    if(mimeType == null){
                        AutoDetectParser parser = new AutoDetectParser();
                        Detector detector = parser.getDetector();
                        Metadata md = new Metadata();
                        mimeType = detector.detect(is,md).toString();

                        if (mimeType.contains("pdf")){
                            mimeType ="pdf";
                        }
                        else if(mimeType.contains("tif")||mimeType.contains("tiff")){
                            mimeType = "tif";
                        }
                    }
                    if(mimeType.contains("png")){
                        mimeType ="png";
                    }
                    else if( mimeType.contains("jpg")||mimeType.contains("jpeg")){
                        mimeType = "jpg";
                    }
                    else if (mimeType.contains("pdf")){
                        mimeType ="pdf";
                    }
                    else if(mimeType.contains("tif")||mimeType.contains("tiff")){
                        mimeType = "tif";
                    }

                    currentImageType = ImageType.fromValue(mimeType);
                }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top