12

ディレクトリから読み込んでいるファイルがjpgかどうかを確認したいのですが、単に拡張子を確認したくありません。別の方法はヘッダーを読むことだと考えています。私はいくつかの研究を行い、使用したいと思います

ImageIO.read

例を見てきました

String directory="/directory";     

BufferedImage img = null;
try {
   img = ImageIO.read(new File(directory));
} catch (IOException e) {
   //it is not a jpg file
}

ここからどこに行けばいいのかわかりません。ディレクトリ全体が必要です...しかし、ディレクトリ内の各jpgファイルが必要です。私のコードの何が問題なのか、または何を追加する必要があるのか​​ 誰か教えてもらえますか?

ありがとうございました!

4

3 に答える 3

8

バッファリングされたイメージに格納された最初のバイトを読み取ることができます。これにより、正確なファイルタイプが得られます

Example for GIF it will be
GIF87a or GIF89a 

For JPEG 
image files begin with FF D8 and end with FF D9

http://en.wikipedia.org/wiki/Magic_number_(プログラミング)

これを試して

  Boolean status = isJPEG(new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg"));
System.out.println("Status: " + status);


private static Boolean isJPEG(File filename) throws Exception {
    DataInputStream ins = new DataInputStream(new BufferedInputStream(new FileInputStream(filename)));
    try {
        if (ins.readInt() == 0xffd8ffe0) {
            return true;
        } else {
            return false;

        }
    } finally {
        ins.close();
    }
}
于 2013-03-21T04:57:35.827 に答える
4

形式の読み取りに使用されるリーダーを取得し、指定されたファイルに使用できるリーダーがないことを確認する必要があります...

String fileName = "Your image file to be read";
ImageInputStream iis = ImageIO.createImageInputStream(new File(fileName ));
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("jpg");
boolean canRead = false;
while (readers.hasNext()) {
    try {        
        ImageReader reader = readers.next();
        reader.setInput(iis);
        reader.read(0);
        canRead = true;
        break;
    } catch (IOException exp) {
    }        
}

基本的に、どのリーダーもファイルを読み取ることができない場合、それは Jpeg ではありません。

警告

これは、指定されたファイル形式で利用可能なリーダーがある場合にのみ機能します。まだ Jpeg である可能性がありますが、指定された形式で使用できるリーダーがありません...

于 2013-03-21T04:51:19.927 に答える