【问题标题】:How to detect PNG images and not just JPG images如何检测 PNG 图像而不仅仅是 JPG 图像
【发布时间】:2015-06-13 22:00:04
【问题描述】:

这段代码运行良好,但它只检测 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 图像?

编辑:仔细检查时,“结果”将变为 JP​​G 的“图像”和 PNG 的“应用程序”。我猜对了,PNG 不是唯一具有“应用程序”mimeType 的文件类型吗?

【问题讨论】:

  • PNG 的正确 MIME 类型是“image/png”。您的MimetypesFileTypeMap() 函数需要修复或更新。

标签: java file png jpeg detection


【解决方案1】:

这个问题可以通过在 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;
    }

【讨论】:

    【解决方案2】:

    通常,文件的 mime 类型是:

    PNG:图片/png
    JPG:图片/jpg
    ...

    您可以找到完整列表here

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

    【讨论】:

      【解决方案3】:

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

      【讨论】: