- 締切済み
ファイル形式が分かる方法はないでしょうか?
画面(HTML)からアップロードされたファイル(ByteArrayInputStream)から ファイル形式を知る方法はないでしょうか? 例えばこのファイルはgifとかjpegとかが知りたいのです。 ByteArrayInputStream bis = new ByteArrayInputStream(form.getUploadListImage()); ここからファイルの形式が分かる事ってできるのでしょうか? お願いします。。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Gishi
- ベストアンサー率57% (11/19)
ImageReader を使うことで、 画像のフォーマットを特定できます。 以下のコードを実行してみてください。 import java.io.*; import java.util.*; import java.awt.*; import java.awt.image.*; import javax.imageio.*; import javax.imageio.stream.*; public class DetectImageFormat { public static void main(String[] args) throws Exception { // ByteArrayInputStream でもOKです InputStream in = new FileInputStream(args[0]); ImageInputStream imageIn = ImageIO.createImageInputStream(in); Iterator<ImageReader> readers = ImageIO.getImageReaders(imageIn); if (readers.hasNext()) { System.out.println("format: " + readers.next().getFormatName()); } else { System.out.println("unknown image format"); } in.close(); } }
#1です >どうすればシグネチャは取得できるのでしょうか? 単純にByteArrayInputStream#read(byte[] b, int off, int len) メソッドで先頭の数バイトを読み、調べるだけです。 各ファイルフォーマットには固有のヘッダが存在するので たとえばGIFなら0x47,0x49,0x46が先頭3byteになっているはずです。 テキストエディタで開いてもGIFという文字が先頭に出てきます。 JPEGなら先頭2byteは0xFF,0xD8です。
ストリームの先頭数バイトを見て判断するのはどうでしょうか? 必ずフォーマット固有のシグネチャが入っているはずです。
補足
返信ありがとうございます。 >ストリームの先頭数バイトを見て判断するのはどうでしょうか? >必ずフォーマット固有のシグネチャが入っているはずです。 どうすればシグネチャは取得できるのでしょうか? また、 ByteArrayInputStream bis = new ByteArrayInputStream(form.getUploadListImage()); BufferedImage image = ImageIO.read(bis); のようにBufferedImageにキャストして簡単にファイル形式が取得できないかAPI見るなどして調べたのですが、BufferedImageにはファイル形式を取得できるようなメソッドは見つかりませんでした。 他に方法はないものでしょうか? よろしくお願いします。