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

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

我该行之前如果该文件存在检查。但是,我怎么能检查,如果该文件是为.bmp或.TIFF或图像文件?

有谁知道?

有帮助吗?

解决方案

在难懂的项目有工具来识别图像,并有一个Java包装对难懂的所谓JMagick我想你可能要改为考虑重新发明轮子的:

http://www.jmagick.org

我使用难懂的所有的时间,包括其在命令行“辨识”功能,它永远不会失败了一次以识别图片。

早在天,我绝对需要的功能和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);
                }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top