【问题标题】:Fix images for which the mime type can not be detected修复无法检测到 mime 类型的图像
【发布时间】:2016-01-20 23:26:16
【问题描述】:

我有很多图像需要使用第三方 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

【问题讨论】:

  • 嗯? AFAIK 图像中没有嵌入 MIME 类型 - 它通常由 Web 服务器添加,那么您的 MIME 类型实际存储或实际来自哪里?
  • @MarkSetchell 我已更新文本以反映实际检测到 mime 类型并且未嵌入文件中。
  • 如果您要回答自己的问题,请将其作为答案。另外-您的问题措辞仍然很糟糕。我仍然不知道您的实际问题是什么。
  • @Danack 我已将 shell 脚本放入答案中。不幸的是,我不能比我已经做过的更好地改写这个问题,或者告诉你问题是什么。由于我不知道实际问题是什么,所以我只看到在使用 file 命令时我得到了一些图像的错误 mime 类型。在我的基于 PHP/imagick 的应用程序中无法导入完全相同的图像。运行 convert 可以解决此问题。

标签: bash image-processing imagemagick imagick


【解决方案1】:

所以,基本上你是在说

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 是否有效。

【讨论】:

  • 我已经编辑了原始帖子,其中包含更多信息和一些示例图片。
  • 很高兴它对您有用!在您使用convert 重新编码数千个文件之前,请尝试进行备份并保留一段时间。此外,检查您需要的任何图像元数据是否已保留(版权、GPS 位置、标签等)。另外,检查新编码的文件是否比原始文件大太多。另外,请注意convert 可以在原地正常工作 - 您可以使用与输入文件相同的输出文件。
【解决方案2】:

仅适用于遇到相同问题的任何人。根据 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。您还可以提供保存原始文件的备份目录。

【讨论】:

  • 不错!感谢分享!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2013-01-16
  • 2017-12-06
  • 2011-12-01
  • 1970-01-01
相关资源
最近更新 更多