【问题标题】:Is there any way to determine an image's type from its GD handle?有没有办法从它的 GD 句柄中确定图像的类型?
【发布时间】:2012-03-17 14:20:17
【问题描述】:

我正在编写一个缩略图脚本,据我所见,缩略图往往在与源代码相同的格式下看起来最好。但是,该脚本可能正在从网络上获取图像,因此我无法访问该文件两次。那么除了exif_imagetype和其他必须重新打开图像的功能之外,还有什么方法可以获取文件类型?我不想依赖扩展,因为这显然是错误的。

我正在使用 GD 进行缩略图处理,所以使用句柄的东西会很完美,但我也可以使用文件的内容。是的,我知道 GD 处理引用未压缩数据,但我不确定他们不记得他们从什么解压缩。

【问题讨论】:

  • 为什么,exif_imagetype 有什么问题?
  • 它必须打开图像文件。因此,如果图像在另一台服务器上,它将被请求两次,一次是在我调用 exif_imagetype 时,另一次是在我实际加载图像时。

标签: php gd thumbnails mime-types exif


【解决方案1】:
function getImageExt($bytes)
{
    $hex_bytes = '';
    for ($i = 0; $i < strlen($bytes); $i++)
    {
        $hex_bytes .=  dechex(ord($bytes[$i]));
    }
    if (strncasecmp($hex_bytes,'FFD8',4) === 0) return 'jpg';
    if (strncasecmp($hex_bytes,'474946',6) === 0) return 'gif';
    if (strncasecmp($hex_bytes,'89504e47',8) === 0) return 'png';
    if (strncasecmp($hex_bytes,'424d',4) === 0) return 'bmp';
    return false;
}

【讨论】:

  • 感谢您提供彻底的解决方案。不过,在我接受之前,我将等待看看是否有更简洁的内容(似乎这应该内置在某些东西中......)。
  • 快速提问 - 为什么要转换所有 $bytes 而不仅仅是前 8 个字节?
  • 因为我相信调用者有责任从图像主体中剪切前 8 个字节。但是,它可以更改为引用调用,从而在函数中完成
  • 好的,很酷。我决定使用你的代码并且它工作得很好。再次感谢。
【解决方案2】:

希望对你有帮助

// with GD
$img = getimagesize($path);
return $img['mime'];

// with FileInfo
$fi = new finfo(FILEINFO_MIME);
return $fi->file($path);

【讨论】:

  • 谢谢,但这两个都需要从文件中读取,如果图像托管在其他地方,这意味着两个请求,我稍后想读取整个内容。
猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 2012-06-24
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2020-11-18
相关资源
最近更新 更多