修复无法检测到 MIME 类型的图像

Fix images for which the mime type can not be detected

我有很多 图像需要使用第三方PHP 工具处理。所有这些图像都是 GIF、JPEG 或 PNG。但是,由于不正确的 MIME 类型,我在某些图像上遇到了错误。结果是一些图像(主要是 JPG 文件)被检测为 "application/octet-stream".

每当我用任何查看器打开图像时,一切似乎都正常。使用 Photoshop 重新保存此类图像后,MIME 类型被正确检测为 "image/jpeg"。我只是不喜欢打开和重新保存数千张图片。

我已经构建了一个出现问题的文件名列表。有什么方法可以 'fix' 检测到正确的 mime 类型的图像吗?

我使用以下命令发现了不正确的 MIME 类型: file --mime-type <filename>

以下是一些示例图片:

运行 identify -ping -verbose <filename> 不 return mime 类型只有 Format。所有带有或不带有正确 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

所以,基本上你是说

file --mime-type <filename>

不起作用?如果是这样,请尝试让 ImageMagick 为您解决:

identify -ping -verbose someImage.jpg | awk '/Mime type:/{print $NF}'

或post一些麻烦的图像,以便其他人可以测试一下。

也许您可以使用 ImageMagick 重写文件,然后 file --mime-type 就可以了。尝试 运行 这个:

convert troubleFile.jpg rebuilt.jpg

看看 file --mime-type rebuilt.jpg 是否有效。

仅供遇到相同问题的任何人使用。根据 Mark Setchell 的回答,我创建了以下 shell 脚本:

#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

if [[ $# -lt 1 ]] || [[ $# -gt 2 ]];
then
  echo "Usage [=10=] <directory> [<backupdir>]"
  exit
fi

for FILENAME in $(find  -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  ]];
    then
      echo "  - Creating backup"
      cp "$FILENAME" ""
    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。您还可以提供一个用于保存原始文件的备份目录。