2012-03-10 24 views
28

używam jakiś plik IO i chcą wiedzieć, czy istnieje sposób, aby sprawdzić, czy plik jest obraz?Sprawdza czy plik jest plikiem obrazu

+1

http://stackoverflow.com/questions/670546/determine-if-file-is-an-image (C#, ale chodzi o sprawdzanie nagłówków , który nie jest specyficzny dla danego języka) lub http://stackoverflow.com/questions/2192717/check-if-a-file-is-an-image lub http://stackoverflow.com/questions/9244710/know- if-a-file-is-a-image-in-java-android lub – birryree

Odpowiedz

36

To działa całkiem dobrze dla mnie. Nadzieję, że mogłem pomóc

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

próbowałem go, ale zawsze zwraca "application/octet-stream – dermoritz

+0

hi @dermoritz To wydaje się być problemem w twoim systemie. post http: // stackoverflow.com/questions/4855627/java-mimetypesfiletypemap-zawsze-powracająca-aplikacja-oktet-stream-on-android-e –

+0

Co z adresem URL? Przed zapisaniem adresu URL do pliku? Dostałem "application/octet-stream" zamiast obrazu. Dowolny pomysł ? – WowBow

3

Można spróbować czegoś takiego:

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 
    } 

to powinno działać, chociaż nie wydaje się być najbardziej elegancka wersja.

+0

Zastanawiam się, gdzie jest różnica od mojego rozwiązania –

+1

Przykro mi, kiedy napisałem odpowiedź, twoja nie było ... może zajęło mi to zbyt dużo czasu, aby ją napisać. Ale masz rację, jest zupełnie taki sam :) – GameDroids

+0

eheh, bez problemu. Myślę, że zdarza się to każdemu przez cały czas. :) –

10

W Javie 7, istnieje metoda java.nio.file.Files.probeContentType(). W systemie Windows wykorzystuje to rozszerzenie pliku i rejestr (nie sprawdza zawartości pliku). Następnie możesz sprawdzić drugą część typu MIME i sprawdzić, czy ma on postać <X>/image.

+2

działa, ale powinieneś użyć pierwszej części "image/jpeg" – dermoritz

+1

W Linuksie wydaje się, że patrzysz tylko na rozszerzenie na moim komputerze. Zmieniono plik .jpeg na .txt i zwrócono "tekst/zwykły". Podoba mi się odpowiedź Krystiana poniżej. – yngwietiger

2

Istnieje wiele sposobów, aby to zrobić; zobacz inne odpowiedzi i linki do powiązanych pytań. (Podejście Java 7 wydaje mi się najbardziej atrakcyjne, ponieważ domyślnie używa konwencji związanych z platformą i możesz podać swój własny schemat określania typu pliku.)

Chciałbym jednak zaznaczyć, że nie mechanizm jest całkowicie nieomylny:

  • metod, które opierają się na przyrostkiem plik zostanie oszukany jeśli przyrostek jest niestandardowa lub źle.

  • Metody, które polegają na atrybutach pliku zostanie oszukany, jeśli plik ma niepoprawny atrybut type contetnt lub wcale.

  • Metody, które polegają na patrząc na podpis pliku można nabrać plików binarnych, które akurat mają takie same bajty podpisu.

  • Nawet próba odczytania pliku jako obrazu może zostać oszukana, jeśli nie masz szczęścia ... w zależności od formatu (formatów) obrazu, który wypróbujesz.

5

Można spróbować czegoś takiego:

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

Można również użyć tego sposobu, jeśli chcesz sprawdzić obrazy przez ograniczone rozszerzenia. Powinieneś jednak zastosować twarde rozszerzenia kodu, które chcesz filtrować.

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; 

Ale polecam ten sposób,

public static boolean isImage(String filepath) throws IOException { 
    File f = new File(filepath); 
    return (ImageIO.read(f) != null); 
} 
Powiązane problemy