我正在使用JAI并创建一个文件:
PlanarImage img = JAI.create("fileload", myFilename);
如果文件存在,我会在该行之前检查。但是,如何检查文件是.bmp还是.tiff或图像文件?
有人知道吗?
答案 0 :(得分:8)
Image Magick项目具有识别图像的功能,并且Image Magick的Java包装器名为JMagick,我认为您可能需要考虑而不是重新发明轮子:
我一直在使用Image Magick,包括命令行中的“识别”功能,它一旦识别图片就不会失败。
回到我绝对需要该功能并且JMagick不存在的日子我已经习惯了Runtime.exec()
来自Java的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
答案 1 :(得分:4)
尝试使用图像的宽度:
boolean isImage(String image_path){
Image image = new ImageIcon(image_path).getImage();
if(image.getWidth(null) == -1){
return false;
}
else{
return true;
}
}
如果宽度为-1则不是图像。
答案 2 :(得分:3)
为了判断某些内容是否为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;
}
答案 3 :(得分:1)
你可以使用DROID这个提供Java API的文件格式识别工具,大致可以这样使用:
AnalysisController controller = new AnalysisController();
controller.readSigFile(signatureFileLocation);
controller.addFile(fileToIdentify.getAbsolutePath());
controller.runFileFormatAnalysis();
Iterator<IdentificationFile> it = controller.getFileCollection().getIterator();
关于API使用的文档相当稀疏,但您可以查看this working example(有趣的部分在identifyOneBinary
方法中)。
答案 4 :(得分:1)
在文件的开头,有一个识别字符序列。 例如,JPEG文件以FF D8 FF开头。
您可以在程序中检查此序列,但我不确定这是否适用于每个文件。
有关识别字符的信息,您可以查看http://filext.com
答案 5 :(得分:0)
确定文件内容的唯一(半)可靠方法是打开它并读取前几个字符。然后,您可以使用一组测试(例如在Unix文件命令中实现的测试)来对文件的内容进行有根据的猜测。
答案 6 :(得分:0)
扩展Birkan的答案,这里有一个“魔术数字”列表:
http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html
我刚检查了一个BMP和TIFF文件(两者都是在Windows XP / Paint中创建的),它们似乎是正确的:
First two bytes "42 4d" -> BMP
First four bytes "4d 4d 00 2a" -> TIFF
我使用VIM编辑文件,然后使用工具|转换为十六进制,但您也可以使用'od -c'或类似的东西来检查它们。
总而言之,当我发现用于编译Java类的神奇数字时,我有点觉得好笑:'ca fe ba be' - 'cafe babe':)
答案 7 :(得分:0)
尝试使用标准JavaBeans Activation Framework(JAF)
使用JavaBeans Activation Framework标准扩展,使用Java技术的开发人员可以利用标准服务确定任意数据的类型,封装对其的访问,发现可用的操作它,并实例化适当的bean来执行所述操作。例如,如果浏览器获得了JPEG图像,则此框架将使浏览器能够将该数据流识别为JPEG图像,并且从该类型,浏览器可以找到并实例化可能的对象。操纵或查看该图像。
答案 8 :(得分:0)
var obj = {
messages :[]
}
self.clear = function(){
obj.messages.length = 0;
};