如何检测PNG图像而不仅仅是JPG图像

时间:2015-04-08 19:05:04

标签: java file png jpeg detection

此代码运行良好,但它只检测JPG而不是PNG

public String[] getImageFileList(String path_to_directory){
        File file = new File(path_to_directory);
        if(!file.exists())return null;
        String[] images = file.list(new FilenameFilter() {
              @Override
              public boolean accept(File current, String name) {
                boolean result;
                File file = new File(current, name);
                String mimeType = new MimetypesFileTypeMap().getContentType(file).split("/")[0];
                result = mimeType.equals("image");
                return result;
              }
            });
        return images;
    }

如何让它检测到PNG图像呢?

编辑:当仔细检查"结果"将成为"图像"对于JPG和"应用程序"对于PNG。我是否正确地猜测PNG不是唯一具有该应用程序的文件类型" mime类型?

3 个答案:

答案 0 :(得分:2)

可以通过定义要在MimetypesFileTypeMap中查找的文件类型来解决问题,如下所示:

MimetypesFileTypeMap mtftp = new MimetypesFileTypeMap();
mtftp.addMimeTypes("image png jpg jpeg")

然后得到的功能代码如下:

public String[] getImageFileList(String path_to_directory){
        File file = new File(path_to_directory);
        if(!file.exists())return null;
        String[] images = file.list(new FilenameFilter() {
              @Override
              public boolean accept(File current, String name) {
                boolean result;
                File file = new File(current, name);
                MimetypesFileTypeMap mftp = new MimetypesFileTypeMap();
                mftp.addMimeTypes("image png jpg jpeg");
                String mimeType = mftp.getContentType(file).split("/")[0];
                result = mimeType.equals("image");
                System.out.println(mimeType);
                return result;
              }
            });
        return images;
    }

答案 1 :(得分:0)

如果要检测图像文件,则需要读取前几个字节并检测其签名。大多数图像格式(包括JPEG和PNG)在文件头上都有独特的结构。

答案 2 :(得分:0)

通常,文件的mime类型为:

PNG:image / png
JPG:image / jpg
...

您可以找到完整列表here

在您的代码中,在检查mime类型时,我认为您有一些png文件没有表示为“image / png”而是我认为它们是“application / octet-stream”或类似的东西。当您通过互联网上传或下载文件时,该文件可以在网络上获取mime类型为“application / octet-stream”。

或者,

您的应用程序无法获取文件的正确mime类型。

this answer,表示如果没有将文件类型正确设置到MimetypesFileTypeMap实例,则可能总是将mime类型设置为“application / octet-stream”。所以解决方案是将所需的文件类型设置为MimetypesFileTypeMap实例,如下所示:

MimetypesFileTypeMap mtftp = new MimetypesFileTypeMap();
mtftp.addMimeTypes("image png jpeg jpg");

然后我认为你的程序将开始正确检测png文件的mime类型。