我正在构建一个自动将 png 转换为 jpg,一切都已构建,但我在检测 png 文件时遇到了问题。现在我正在使用文件名:我正在检查文件的结尾是否匹配.png
,但这不适用于不以.png
.
有任何想法吗?
我正在构建一个自动将 png 转换为 jpg,一切都已构建,但我在检测 png 文件时遇到了问题。现在我正在使用文件名:我正在检查文件的结尾是否匹配.png
,但这不适用于不以.png
.
有任何想法吗?
你可以试试这个
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());
}
您可以使用Files.probeContentType(path)
获取 mime 类型
我使用爬虫从网站下载了一些图像。所有图像在源代码中都以 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