2012-03-10 17 views
28

Sto usando qualche file IO e voglio sapere se c'è un metodo per controllare se un file è un'immagine?verificare se un file è un file di immagine

+1

http://stackoverflow.com/questions/670546/determine-if-file-is-an-image (C#, ma si tratta di controllare le intestazioni , che non è specifico per la lingua) o http://stackoverflow.com/questions/2192717/check-if-a-file-is-an-image o http://stackoverflow.com/questions/9244710/know- se-a-file-is-a-image-in-java-Android o – birryree

risposta

36

Questo funziona abbastanza bene per me. Spero di poter aiutare

import javax.activation.MimetypesFileTypeMap; 
import java.io.File; 
class Untitled { 
    public static void main(String[] args) { 
     String filepath = "/the/file/path/image.jpg"; 
     File f = new File(filepath); 
     String mimetype= new MimetypesFileTypeMap().getContentType(f); 
     String type = mimetype.split("/")[0]; 
     if(type.equals("image")) 
      System.out.println("It's an image"); 
     else 
      System.out.println("It's NOT an image"); 
    } 
} 
+3

ho provato ma sempre tornare "application/octet-stream – dermoritz

+0

hi @dermoritz questo sembra essere un problema nel sistema. Dai un'occhiata a questo SO post http: // StackOverflow.it/questions/4855627/java-mimetypesfiletypemap-always-return-application-octet-stream-on-android-e –

+0

E se provenisse dall'URL? Prima di salvare l'URL in un file? Ho ottenuto "application/octet-stream" al posto dell'immagine. Qualche idea ? – WowBow

3

Si può provare qualcosa di simile:

import javax.activation.MimetypesFileTypeMap; 

    File myFile; 

    String mimeType = new MimetypesFileTypeMap().getContentType(myFile)); 
    // mimeType should now be something like "image/png" 

    if(mimeType.substring(0,5).equalsIgnoreCase("image")){ 
     // its an image 
    } 

questo dovrebbe funzionare, anche se non sembra essere il più elegante versione.

+0

mi chiedo dove è la differenza dalla mia soluzione –

+1

scusa, quando ho scritto la mia risposta non era lì ... forse mi ci è voluto troppo tempo per scriverlo. Ma hai ragione, è completamente uguale :) – GameDroids

+0

eheh, nessun problema. Penso che capiti a tutti tutto il tempo qui. :) –

10

In Java 7, c'è il metodo java.nio.file.Files.probeContentType(). Su Windows, questo utilizza l'estensione del file e il registro (non controlla il contenuto del file). È quindi possibile controllare la seconda parte del tipo MIME e verificare se è nel formato <X>/image.

+2

funziona ma dovresti usare la prima parte "image/jpeg" – dermoritz

+1

Su Linux, sembra guardare solo l'estensione sulla mia macchina. Modificato un file .jpeg in .txt e restituito "text/plain". Mi piace la risposta di Krystian qui sotto. – yngwietiger

2

Ci sono una varietà di modi per farlo; vedere altre risposte e i link alle domande correlate. (L'approccio Java 7 sembra il più attraente per me, perché utilizza le convenzioni specifiche della piattaforma per impostazione predefinita e puoi fornire il tuo schema per la determinazione del tipo di file.)

Tuttavia, vorrei solo sottolineare che no meccanismo è del tutto infallibile:

  • I metodi che si basano sul suffisso del file sarà ingannato se il suffisso è non standard o sbagliato.

  • I metodi che si basano su attributi di file saranno ingannati se il file ha un attributo di tipo contetnt errato o del tutto assente.

  • I metodi che si basano sulla firma del file possono essere ingannati dai file binari che hanno gli stessi byte di firma.

  • Anche il semplice tentativo di leggere il file come immagine può essere ingannato se si è sfortunati ... a seconda dei formati di immagine che si provano.

5

si può provare qualcosa di simile:

String pathname="abc\xyz.png" 
File file=new File(pathname); 


String mimetype = Files.probeContentType(file.toPath()); 
//mimetype should be something like "image/png" 

if (mimetype != null && mimetype.split("/")[0].equals("image")) { 
    System.out.println("it is an image"); 
} 
0
import javax.activation.MimetypesFileTypeMap; 
import java.io.File; 
class Untitled 
{ 
public static void main(String[] args) 
{ 
    String filepath = "/the/file/path/image.jpg"; 
    File f = new File(filepath); 
    String mimetype= new MimetypesFileTypeMap().getContentType(f); 

    if(mimetype.startsWith("image/")) 
     System.out.println("It's an image"); 
    else 
     System.out.println("It's NOT an image"); 
} 
} 
0

È inoltre possibile utilizzare questo modo se si desidera controllare immagini con estensioni limitate. Ma dovresti estendere le estensioni del codice che vuoi filtrare.

public static boolean isImage(String filepath) { 
    String[] extensions = {".jpg",".png"}; 
    for (String extension : extensions) { 
     if(filepath.endsWith(extension)){ 
      System.out.println("Its an image"); 
      return true; 
     } 
    } 
    return false; 

Ma vi consiglio in questo modo,

public static boolean isImage(String filepath) throws IOException { 
    File f = new File(filepath); 
    return (ImageIO.read(f) != null); 
} 
Problemi correlati