質問
JAI を使用しており、次のファイルを作成します。
PlanarImage img = JAI.create("fileload", myFilename);
その行の前でファイルが存在するかどうかを確認します。しかし、ファイルが .bmp、.tiff、または画像ファイルであるかどうかを確認するにはどうすればよいでしょうか?
誰か知っていますか?
解決
画像Magickのプロジェクトは、画像を識別するための施設を持っており、私はあなたが車輪の再発明するのではなく、検討する必要かもしれないと思う魔術はJMagickと呼ばれる画像のJavaラッパーがあります:
私は、そのコマンドラインから機能を「特定」と、それは絵を識別するために、一度失敗したことはありませんを含む、画像魔術のすべての時間を使用しています。
私は絶対に必要な日数で戻る機能とJMagickが存在しなかったことを、まだ私は、JavaからImageMagickののRuntime.exec()
コマンドをidentify
するために使用し、それが完全に働いています。
今日でJMagickが存在すること、これが(私はまだJMagickを試していない)は、おそらくもう必要ありません。
それは例えば、はるかに単なる形式よりも与えることを注:
$ 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
他のヒント
画像の幅を使用してみてください。
boolean isImage(String image_path){
Image image = new ImageIcon(image_path).getImage();
if(image.getWidth(null) == -1){
return false;
}
else{
return true;
}
}
は幅がある場合-1、画像ではない。
。
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;
}
は、ファイルの開始時に、特定の文字列があります。 例えば、JPEGはFF D8 FFで始まるをファイルます。
あなたは、あなたのプログラムでこのシーケンスを確認することができますが、私はすべてのファイルに対して、この作品かどうかを確認していません。
あなたが見てすることができ、文字を特定する方法については http://filext.comする
使用できます ドロイド, 、Java API も提供するファイル形式識別ツールで、大まかに次のように使用します。
AnalysisController controller = new AnalysisController();
controller.readSigFile(signatureFileLocation);
controller.addFile(fileToIdentify.getAbsolutePath());
controller.runFileFormatAnalysis();
Iterator<IdentificationFile> it = controller.getFileCollection().getIterator();
API の使用法に関するドキュメントはかなり少ないですが、以下を参照してください。 この実際の例 (興味深い部分は identifyOneBinary
方法)。
ファイルの内容を決定する唯一の(半)信頼性の高い方法は、それを開いて、最初の数文字を読むことです。そして、あなたは、ファイルの内容として推測をするために、このようなUnixファイルコマンドで実行されるような一連のテストを使用することができます。
Birkanの答えを拡張し、「マジックナンバー」利用できるここのリストがあります:
http://www.astro.keele.ac .ukの/ oldusers / RNO /コンピューティング/ File_magic.htmlする
私は(両方だけのWindows XPで作成/ペイント)BMPやTIFFファイルをチェックし、それらが正しく表示されます:
First two bytes "42 4d" -> BMP
First four bytes "4d 4d 00 2a" -> TIFF
私が編集したファイルをVIMを使用して、ツールをしました| Hexに変換しますが、「OD -c」またはそれらを確認して同様のものを使用することができます。
私はコンパイルされたJavaクラスを使用マジックナンバーを見つけたときはさておき、完全な、私は少し面白がったように:「CA FE BAも」 - 「カフェベイブ」)
のJavaBeans起動フレームワークの標準を使用してみてください(JAF)
のJavaBeans起動フレームワークの標準的な拡張子で、Javaテクノロジを使用する開発者は、それまでのデータの任意の部分のタイプを決定するの、カプセル化へのアクセスに標準のサービスを利用することができます利用可能にオペレーションを発見また、前記動作(単数または複数)を実行するために適切なBeanをインスタンス化します。ブラウザは、JPEG画像を取得した場合、このフレームワークは、JPEG画像のようにデータのストリームを識別するためのブラウザを可能にし、その型から、ブラウザが検索し、可能性のオブジェクトをインスタンス化することができ操作、またはその画像を表示する。
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);
}