5

我正在构建一个自动将 png 转换为 jpg,一切都已构建,但我在检测 png 文件时遇到了问题。现在我正在使用文件名:我正在检查文件的结尾是否匹配.png,但这不适用于不以.png.

有任何想法吗?

4

4 回答 4

3

你可以试试这个

import javax.activation.MimetypesFileTypeMap;
import java.io.File;

class GetMimeType {
  public static void main(String args[]) {
    File f = new File(filePath);
    System.out.println("Mime Type of " + f.getName() + " is " +
                         new MimetypesFileTypeMap().getContentType(f));

}

或者

尝试

public String getContentType(File file) throws IOException {
        return Files.probeContentType(file.getAbsolutePath());
}
于 2013-10-04T07:07:39.130 回答
2

您可以检查文件的标题。
请参阅http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

于 2013-10-04T06:51:22.217 回答
1

您可以使用Files.probeContentType(path)获取 mime 类型

于 2013-10-04T06:51:15.240 回答
1

我使用爬虫从网站下载了一些图像。所有图像在源代码中都以 JPG 格式列出,但其中混入了一些 PNG。浏览器很灵活,因为 Web 很混乱,但并非所有桌面应用程序都能正确处理扩展名为 .jpg 的 PNG 文件。我在接受的答案中尝试了各种解决方案,但它们都使用文件名来识别 MIME 类型。我检查了 MimetypesFileTypeMap 的源代码(java8),即使您将文件传递给它,它也只会获取文件名并使用它来确定 mime 类型。

因此,我选择读取 4 字节文件头来确定它是 Itay Karo 建议的 JPG 还是 PNG。对于 JPG,第一个字节是 FF,对于 PNG,它是 89(十六进制)。

private static boolean isPng(File file) throws IOException {
    try (FileInputStream is = new FileInputStream(file)) {
        return Integer.toHexString(is.read).equals("89");
    }
}

等于 139(以 10 为底),因此更有效的解决方案是:

private static boolean isPng(File file) throws IOException {
    try (FileInputStream is = new FileInputStream(file)) {
        return is.read() == 137;
    }
}

请注意,这足以区分 JPG 和 PNG,但如果您真的不知道要处理的文件类型,您可能还需要检查其余字节以获得更高的准确性。向 Itay Karo 提供的道具,用于提供 PNG 标头的描述:

http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

哦,还有一件事我应该提到。在 Linux 中,您可以使用“文件”来查询 mime 类型:

file -i [file]

不是问题的答案,但编写一个在您的 java 应用程序之后运行的简单 shell 脚本可能更容易:

for file in $(find "$root" -name '*.jpg')
do
        if file -i "$file" | grep -q 'image/png'; then
                rename="${file%.*}.png"
                echo "moving $file -> $rename"
                mv $file $rename
        fi
done
于 2020-02-23T00:55:03.997 回答