2010-02-03 27 views
9

Sto usando JAI e creare un file con:Controllare se un file è un'immagine

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

verifico prima che la linea se il file esiste. Ma come posso verificare se il file è un file .bmp o .tif o un file immagine?

Qualcuno sa?

risposta

8

Il progetto Magick immagine dispone di strutture per identificare immagini e c'è un wrapper Java per ImageMagick chiamato JMagick che credo si può prendere in considerazione, invece di reinventare la ruota:

http://www.jmagick.org

sto usando ImageMagick tutto il tempo, compresa la sua funzione di "identificare" dalla riga di comando e non è mai fallito una volta per identificare una foto.

Indietro nei giorni in cui avevo assolutamente bisogno di quella funzione e JMagick non esisteva ancora mi sono abituato a Runtime.exec() il comando di ImageMagick identify da Java e ha funzionato perfettamente.

Oggigiorno che JMagick esiste, probabilmente non è più necessario (ma non ho ancora provato JMagick).

Nota che dà molto di più che il formato, ad esempio:

$ 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

L'unico modo (semi) affidabile per determinare il contenuto di un file è aprirlo e leggere i primi caratteri. Quindi è possibile utilizzare una serie di test come implementati nel comando file Unix per formulare un'ipotesi sul contenuto del file.

1

Si potrebbe usare DROID, uno strumento per l'identificazione formato di file che offre anche un'API Java, da utilizzare o meno così:

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

documentazione sull'uso API è piuttosto scarsa, ma si può avere un guarda this working example (la parte interessante è nel metodo identifyOneBinary).

1

All'inizio dei file, c'è una sequenza di caratteri identificativi. Ad esempio, i file JPEG iniziano con FF D8 FF.

È possibile verificare questa sequenza nel programma, ma non sono sicuro che funzioni per ogni file.

Per informazioni su come identificare i personaggi si può avere uno sguardo a http://filext.com

0

Ampliando la risposta di Birkan, c'è una lista dei 'numeri magici' disponibile qui:

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

Ho appena controllato un file BMP e TIFF (entrambi appena creati in Windows XP/Paint) e sembrano essere corretti:

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

Ho usato VIM per modificare i file e poi ho fatto Tools | Converti in esadecimale, ma puoi anche usare 'od -c' o qualcosa di simile per controllarli.

come un completo a parte, ero un po 'divertito quando ho scoperto che i numeri magici utilizzati per le classi Java compilate: 'Ca fe Ba Be' - 'Cafe Babe' :)

0

Prova utilizzando lo standard JavaBeans Activation Framework (JAF)

Con l'estensione standard quadro JavaBeans Activation, gli sviluppatori che utilizzano la tecnologia Java possono usufruire di servizi standard che determinare il tipo di un pezzo arbitraria di dati, incapsulare l'accesso ad esso, scoprire le operazioni disponibili su di esso, e per istanziare il bean appropriato per eseguire dette operazioni. Ad esempio, se un browser ha ottenuto un'immagine JPEG, questo framework consentirebbe al browser di identificare quel flusso di dati come un'immagine JPEG, e da quel tipo, il browser potrebbe individuare e creare un'istanza di un oggetto che potrebbe manipolare o visualizzare quello Immagine.

4

Prova utilizzando la larghezza dell'immagine:

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

se la larghezza è -1, allora non è un'immagine.

+2

Forse usando 'ImageIcon.getIconWidth()' direttamente potrebbe anche funzionare? Ritorna, almeno, '-1' se l'immagine non è stata caricata correttamente. – Pooven

3

Per sapere se qualcosa è un png, ho utilizzato questo snippet qui sotto in 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

Proprio quello che stavo cercando –

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