检查文件是否是图像

时间:2010-02-03 14:44:37

标签: java image jai

我正在使用JAI并创建一个文件:

PlanarImage img = JAI.create("fileload", myFilename);

如果文件存在,我会在该行之前检查。但是,如何检查文件是.bmp还是.tiff或图像文件?

有人知道吗?

9 个答案:

答案 0 :(得分:8)

Image Magick项目具有识别图像的功能,并且Image Magick的Java包装器名为JMagick,我认为您可能需要考虑而不是重新发明轮子:

http://www.jmagick.org

我一直在使用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;
};