题
我使用JAI并创建一个文件:
PlanarImage img = JAI.create("fileload", myFilename);
我该行之前如果该文件存在检查。但是,我怎么能检查,如果该文件是为.bmp或.TIFF或图像文件?
有谁知道?
解决方案
在难懂的项目有工具来识别图像,并有一个Java包装对难懂的所谓JMagick我想你可能要改为考虑重新发明轮子的:
我使用难懂的所有的时间,包括其在命令行“辨识”功能,它永远不会失败了一次以识别图片。
早在天,我绝对需要的功能和JMagick还不存在,我以前从Java Runtime.exec()
ImageMagick的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,那么不是图像。
要告诉如果事情是一个png,我已经在Android中Java中使用下面这个片断。
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 FF D8开始。
您可以检查这个序列中的程序,但我不知道是否这适用于所有文件。
有关识别的字符可以看看信息 http://filext.com
您可以使用 DROID ,对文件的工具格式识别其还提供了一个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
我刚刚查了BMP和TIFF文件(都只有在Windows XP中创建/漆),他们似乎是正确的:
First two bytes "42 4d" -> BMP
First four bytes "4d 4d 00 2a" -> TIFF
我用VIM编辑的文件,然后做工具|转换为十六进制,但你也可以使用“OD -c”或类似的检查他们的东西。
作为一个完整的一边,我有点好笑,当我发现用于编译的Java类的神奇数字:“钙,铁,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);
}