【问题标题】:Get Exif image orientation from Base-64 encoded image too slow从 Base-64 编码图像中获取 Exif 图像方向太慢
【发布时间】:2016-06-08 00:57:31
【问题描述】:

我正在使用此代码从其 base64 编码数据中获取 JPEG 图像的 Exif 方向。

$exif = exif_read_data('data://image/jpeg;base64,' . $base64EncodedImageData);
$orientation = $exif['Orientation'];

但是,此代码速度很慢,尤其是在处理高清图像时。有什么方法可以更快地获得方向?


传递实际文件路径而不是 base-64 编码字符串时似乎要快得多,但图像不在磁盘上,并且我只有 base-64 编码字符串。

【问题讨论】:

  • 你试过给它一个路径而不是一个blob吗?:exif_read_data('/path/to/image.jpg');
  • @mistermartin 我只有一个blob。不过,使用路径确实要快得多(刚刚测试过)。
  • 尝试仅获取需要的标签并禁用对数组的解析,在您的情况下为exif_read_data($img, 'IFD0', false)
  • @maximkou 不起作用。我认为您误解了第二个参数的用途 - 它指定了函数不返回 false 需要存在的部分。

标签: php


【解决方案1】:

您正在加载整个 blob 的事实是它需要这么长时间的原因,因此您实际上只需要加载包含 exif 数据的图像部分。

当你给exif_read_data 一个文件路径而不是一个blob 时,它默认只读取必要的信息。如果这根本不是一种选择,那么您可能需要一个丑陋的解决方法/hack。

例如,您可以指定一个硬编码值:

$image = base64_encode(file_get_contents('test.jpg'));
echo strlen($image) . '<br />'; // 81684
// only read the first 30000 characters
$exif = exif_read_data('data://image/jpeg;base64,' . substr($image, 0, 30000));
echo '<pre>';
var_dump($exif);
echo '</pre>';

或者您可以动态增加它,直到找到合适的大小:

$image = base64_encode(file_get_contents('test.jpg'));
$read = '8192';
// this will produce errors, so i am suppressing them
while (!$exif = @exif_read_data('data://image/jpeg;base64,' . substr($image, 0, $read))) {
    $read += $read;
}
echo '<pre>';
var_dump($exif);
echo '</pre>';

可能有更好的解决方案,但我不知道它是什么。希望对您有所帮助。

【讨论】:

  • 我想更好的解决方案是手动读取和解析文件,而不是使用exif_read_data。
猜你喜欢
  • 2019-02-16
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2016-02-18
  • 2022-01-04
相关资源
最近更新 更多