2010-02-03 10 views
9

J'utilise et créer un JAI fichier:Vérifiez si un fichier est une image

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

Je vérifie avant cette ligne si le fichier existe. Mais comment puis-je vérifier si le fichier est un .bmp ou un .tiff ou un fichier image?

Quelqu'un sait-il?

Répondre

8

L'image projet Magick dispose d'installations pour identifier l'image et il y a un wrapper Java pour Image Magick appelé JMagick que je pense que vous pouvez envisager au lieu de réinventer la roue:

http://www.jmagick.org

J'utilise image Magick tout le temps, y compris son « identifier » caractéristique de la ligne de commande et il n'a jamais réussi à identifier une image.

À l'époque où j'avais absolument besoin de cette fonctionnalité et JMagick n'existait pas encore, je l'habitude Runtime.exec() commande identify ImageMagick de Java et cela a fonctionné parfaitement.

De nos jours, l'existence de JMagick n'est probablement plus nécessaire (mais je n'ai pas encore essayé JMagick).

Notez qu'il donne beaucoup plus que le format, par exemple:

$ 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 
0

La seule façon (semi) fiable de déterminer le contenu d'un fichier consiste à l'ouvrir et à lire les premiers caractères. Ensuite, vous pouvez utiliser un ensemble de tests tels que mis en œuvre dans la commande de fichier Unix pour faire une supposition éclairée quant au contenu du fichier.

1

Vous pouvez utiliser DROID, un outil pour l'identification de format de fichier qui offre également une API Java, à utiliser à peu près comme ceci:

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

Documentation sur l'utilisation de l'API est assez rare, mais vous pouvez avoir un Regardez this working example (la partie intéressante est dans la méthode identifyOneBinary).

1

Au début des fichiers, il y a une séquence de caractères d'identification. Par exemple, les fichiers JPEG commencent par FF D8 FF.

Vous pouvez vérifier cette séquence dans votre programme mais je ne suis pas sûr que cela fonctionne pour tous les fichiers.

Pour plus d'informations sur les caractères d'identification, vous pouvez jeter un oeil à http://filext.com

0

expansion sur la réponse de Birkan, il y a une liste des 'nombres magiques' ici:

http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html

Je viens de vérifier un fichier BMP et TIFF (à la fois juste créé dans Windows XP/Paint), et ils semblent être corrects:

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

J'ai utilisé VIM pour éditer les fichiers, puis j'ai fait Outils | Convertir en hexadécimal, mais vous pouvez également utiliser 'od -c' ou quelque chose de similaire pour les vérifier.

En tant que complète à part, j'étais un peu amusé quand j'ai découvert les nombres magiques utilisés pour Java compilés Classes: « ca fe ba être » - « babe cafe » :)

0

Essayez d'utiliser la norme JavaBeans Activation Framework (JAF)

Avec le cadre d'activation JavaBeans extension standard, les développeurs qui utilisent la technologie Java peuvent profiter des services standard pour déterminer le type d'une pièce arbitraire de données, encapsuler accès, découvrir les opérations disponibles sur, et pour instancier le bean approprié pour effectuer la ou les opérations. Par exemple, si un navigateur obtenait une image JPEG, ce cadre permettrait au navigateur d'identifier ce flux de données en tant qu'image JPEG, et à partir de ce type, le navigateur pourrait localiser et instancier un objet qui pourrait manipuler ou afficher ce image.

4

Essayez d'utiliser la largeur de l'image:

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

si la largeur est alors -1 est pas l'image.

+2

Peut-être en utilisant 'ImageIcon.getIconWidth()' serait aussi directement travailler? Il retourne au moins '-1' si l'image n'a pas été chargée avec succès. – Pooven

3

Pour dire si quelque chose est un png, j'ai utilisé cet extrait ci-dessous dans Android java.

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

Juste ce que je cherchais –

0
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); 
       } 
Questions connexes