Java 检查文件是否为图像
我正在使用JAI并创建一个具有以下内容的文件:Java 检查文件是否为图像,java,image,jai,Java,Image,Jai,我正在使用JAI并创建一个具有以下内容的文件: PlanarImage img = JAI.create("fileload", myFilename); 我在该行之前检查文件是否存在。但是如何检查文件是.bmp还是.tiff或图像文件 有人知道吗?确定文件内容的唯一(半)可靠方法是打开文件并读取前几个字符。然后,您可以使用一组测试,例如在Unix file命令中实现的测试,对文件的内容进行有根据的猜测 您可以使用一个文件格式识别工具,该工具还提供Java API,大致如下所示: Analys
PlanarImage img = JAI.create("fileload", myFilename);
我在该行之前检查文件是否存在。但是如何检查文件是.bmp还是.tiff或图像文件
有人知道吗?确定文件内容的唯一(半)可靠方法是打开文件并读取前几个字符。然后,您可以使用一组测试,例如在Unix file命令中实现的测试,对文件的内容进行有根据的猜测 您可以使用一个文件格式识别工具,该工具还提供Java API,大致如下所示:
AnalysisController controller = new AnalysisController();
controller.readSigFile(signatureFileLocation);
controller.addFile(fileToIdentify.getAbsolutePath());
controller.runFileFormatAnalysis();
Iterator<IdentificationFile> it = controller.getFileCollection().getIterator();
AnalysisController=新的AnalysisController();
controller.readSigFile(signatureFileLocation);
controller.addFile(filetoIdentity.getAbsolutePath());
controller.runFileFormatAnalysis();
迭代器it=controller.getFileCollection().getIterator();
关于API使用的文档非常稀少,但是您可以看一下(有趣的部分在
identificationebarbinary
方法中)。在文件的开头,有一个识别字符序列。
例如,JPEG文件以FF D8 FF开头
你可以在你的程序中检查这个序列,但我不确定这是否适用于每个文件
<关于识别字符的信息,你可以查看< /p> < p>图像Migk项目有识别图像的设施,还有一个java图像包装器,叫做JMaGik,我想你可能会考虑而不是重新发明轮子: 我一直在使用ImageMagick,包括它在命令行中的“识别”功能,它在识别图片时从未失败过 在我绝对需要该功能而JMagick还不存在的时候,我使用Java中的
Runtime.exec()
ImageMagick的identify
命令,它工作得非常好
如今JMagick已经存在,这可能不再必要了(但我还没有尝试过jmagik)
请注意,它提供的不仅仅是格式,例如:
$ 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
关于Birkan的答案,这里有一个“神奇数字”列表: 我刚刚检查了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:”)尝试使用标准(JAF)
通过JavaBeans激活框架标准扩展,使用Java技术的开发人员可以利用标准服务来确定任意数据块的类型,封装对该数据块的访问,发现该数据块上可用的操作,并实例化适当的bean以执行所述操作。例如,如果浏览器获得JPEG图像,此框架将使浏览器能够将该数据流识别为JPEG图像,并且从该类型中,浏览器可以定位并实例化可以操纵或查看该图像的对象。尝试使用图像的宽度:
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;
}
也许直接使用
ImageIcon.getIconWidth()
也能起作用?如果图像没有成功加载,它至少会返回-1
。这正是我要找的
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);
}