Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查文件是否为图像_Java_Image_Jai - Fatal编程技术网

Java 检查文件是否为图像

Java 检查文件是否为图像,java,image,jai,Java,Image,Jai,我正在使用JAI并创建一个具有以下内容的文件: PlanarImage img = JAI.create("fileload", myFilename); 我在该行之前检查文件是否存在。但是如何检查文件是.bmp还是.tiff或图像文件 有人知道吗?确定文件内容的唯一(半)可靠方法是打开文件并读取前几个字符。然后,您可以使用一组测试,例如在Unix file命令中实现的测试,对文件的内容进行有根据的猜测 您可以使用一个文件格式识别工具,该工具还提供Java API,大致如下所示: Analys

我正在使用JAI并创建一个具有以下内容的文件:

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);
                }