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

时间:2015-10-21 20:03:46

标签: bash image-processing imagemagick imagick

我需要使用第三方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

2 个答案:

答案 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中。您还可以提供一个备份目录,用于保存原始文件。