2010-02-03 42 views
9

Tôi đang sử dụng JAI và tạo ra một tập tin với:Kiểm tra xem một tập tin là một hình ảnh

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

tôi kiểm tra trước khi dòng đó nếu tập tin tồn tại. Nhưng làm cách nào tôi có thể kiểm tra xem tệp có phải là tệp .bmp hoặc tệp .tiff hoặc tệp hình ảnh không?

Có ai biết không?

Trả lời

8

Dự án Imagemagick có cơ sở để xác định hình ảnh và có một wrapper Java cho Image Magick gọi JMagick mà tôi nghĩ bạn có thể muốn xem xét việc thay vì tái phát bánh xe:

http://www.jmagick.org

tôi đang sử dụng hình ảnh Magick tất cả các thời gian, bao gồm cả "xác định" tính năng của nó từ dòng lệnh và nó không bao giờ thất bại trong một lần để xác định một bức tranh.

Quay lại những ngày tôi hoàn toàn cần tính năng đó và JMagick chưa tồn tại nhưng tôi đã sử dụng lệnh Runtime.exec() ImageMagick's identify từ Java và nó hoạt động hoàn hảo.

Ngày nay, JMagick tồn tại điều này có lẽ không cần thiết nữa (nhưng tôi chưa thử JMagick).

Lưu ý rằng nó mang lại nhiều hơn chỉ là định dạng, ví dụ:

$ 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

Cách duy nhất (bán) đáng tin cậy để xác định nội dung của tệp là mở nó và đọc một vài ký tự đầu tiên. Sau đó, bạn có thể sử dụng một tập hợp các kiểm tra như được thực hiện trong lệnh tập tin Unix để thực hiện một dự đoán có giáo dục về nội dung của tệp.

1

Bạn có thể sử dụng DROID, một công cụ để xác định định dạng tập tin mà còn cung cấp một API Java, được sử dụng gần như thế này:

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

Tài liệu về việc sử dụng API là khá thưa thớt, nhưng bạn có thể có một xem this working example (phần thú vị nằm trong phương thức identifyOneBinary).

1

Khi bắt đầu tệp, có một chuỗi ký tự xác định. Ví dụ các tệp JPEG bắt đầu bằng FF D8 FF.

Bạn có thể kiểm tra chuỗi này trong chương trình của mình nhưng tôi không chắc liệu điều này có phù hợp với mọi tệp hay không.

Để biết thông tin về việc nhận biết ký tự mà bạn có thể có một cái nhìn tại http://filext.com

0

Mở rộng về câu trả lời Birkan của, có một danh sách các 'con số kỳ diệu' sẵn ở đây:

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

Tôi vừa kiểm tra tệp BMP và TIFF (vừa được tạo trong Windows XP/Paint) và có vẻ như chính xác:

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

Tôi đã sử dụng VIM để chỉnh sửa các tệp và sau đó đã thực hiện Công cụ | Chuyển đổi thành Hex, nhưng bạn cũng có thể sử dụng 'od -c' hoặc một cái gì đó tương tự để kiểm tra chúng.

Là một hoàn chỉnh sang một bên, tôi đã hơi buồn cười khi tôi phát hiện ra những con số ma thuật sử dụng cho Java Classes biên soạn: 'ca fe ba được' - 'quán cà phê Babe' :)

0

Hãy thử sử dụng các tiêu chuẩn JavaBeans Activation Framework (JAF)

với phần mở rộng tiêu chuẩn Khung JavaBeans Activation, phát triển những người sử dụng công nghệ Java có thể tận dụng các dịch vụ tiêu chuẩn để xác định loại một mảnh tùy ý các dữ liệu, đóng gói truy cập vào nó, khám phá các hoạt động có sẵn trên đó, và để khởi tạo bean thích hợp để thực hiện các thao tác đã nói. Ví dụ: nếu trình duyệt thu được hình ảnh JPEG, khung này sẽ bật trình duyệt để xác định luồng dữ liệu dưới dạng hình ảnh JPEG và từ loại đó, trình duyệt có thể định vị và khởi tạo đối tượng có thể thao tác hoặc xem hình ảnh.

4

Hãy thử sử dụng độ rộng của hình ảnh:

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

nếu chiều rộng là -1 sau đó không phải là hình ảnh.

+2

Có lẽ sử dụng 'ImageIcon.getIconWidth()' trực tiếp sẽ còn làm việc? Nó, ít nhất, trả về '-1' nếu hình ảnh không được tải thành công. – Pooven

3

Để biết điều gì đó là png, tôi đã sử dụng đoạn mã dưới đây trong 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; 
} 
+0

Chỉ là những gì tôi đang tìm kiếm –

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); 
       } 
Các vấn đề liên quan