我需要使用第三方PHP工具处理的很多图像。所有这些图像都是GIF,JPEG或PNG。但是,在某些图像上,由于mime类型不正确,我收到错误。事实证明,一些图像(主要是JPG文件)被检测为“application / octet-stream”。
每当我打开任何观众的图像时,一切似乎都没问题。使用Photoshop重新保存这样的图像后,mime类型被正确检测为“image / jpeg”。我只是没有退出打开和重新保存成千上万的图像。
我构建了一个发生问题的文件名列表。有没有办法“修复”图像,以便检测到正确的mime类型?
我使用以下命令找到了不正确的mime类型:
file --mime-type <filename>
以下是一些示例图片:
运行identify -ping -verbose <filename>
不会仅返回mime类型格式。对于包含或不包含正确mime的所有JPG图像,格式为Format: JPEG (Joint Photographic Experts Group JFIF format)
。
有关版本的更多信息:
$ file --version
file-5.14
magic file from /etc/magic:/usr/share/misc/magic
$ identify --version
Version: ImageMagick 6.7.7-10 2014-03-06 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP
答案 0 :(得分:2)
所以,基本上你说的是
file --mime-type <filename>
不起作用?如果是这样,请尝试让ImageMagick为您解决问题:
identify -ping -verbose someImage.jpg | awk '/Mime type:/{print $NF}'
或发布一些麻烦的图像,以便其他人可以测试它。
也许您可以使用ImageMagick重写文件,然后file --mime-type
将起作用。试试这个:
convert troubleFile.jpg rebuilt.jpg
并查看file --mime-type rebuilt.jpg
是否有效。
答案 1 :(得分:1)
只针对遇到同样问题的人。根据Mark Setchell的回答,我创建了以下shell脚本:
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
if [[ $# -lt 1 ]] || [[ $# -gt 2 ]];
then
echo "Usage $0 <directory> [<backupdir>]"
exit
fi
for FILENAME in $(find $1 -regex ".*\.\(jpg\|gif\|png\|jpeg\)");
do
MIME=$(file --mime-type "$FILENAME" | awk '{print $NF}')
if [ "$MIME" == "application/octet-stream" ]
then
echo "$FILENAME has mime type $MIME:"
if [[ ! -z $2 ]];
then
echo " - Creating backup"
cp "$FILENAME" "$2"
fi
echo " - Running convert"
convert "$FILENAME" "$FILENAME"
if [[ $? -eq 0 ]];
then
echo " - Done!"
else
echo " - Error!"
echo "$FILENAME" >> errors.txt
fi
fi
done
IFS=$SAVEIFS
它将递归搜索jpg / png / gif文件的目录并检查mime类型。如果mime类型为"application/octet-stream"
,它将尝试转换图像,而不会在图像中实际执行任何可见的更改。执行此操作后,将检测到正确的mime类型。
无法转换的图片将记录在errors.txt
中。您还可以提供一个备份目录,用于保存原始文件。