2016-06-07 47 views
1

我使用此代码从其base64编码数据获取JPEG图像的Exif方向。从Base-64编码图像获取Exif图像方向太慢

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

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


这似乎传递一个实际的文件路径,而不是base-64编码字符串的时候要快很多,但图像不是在磁盘上和base-64编码字符串是我的一切。

+1

你试过给它一个路径而不是blob吗?''exif_read_data('/ path/to/image.jpg');' –

+0

@mistermartin我只有一个blob。尽管(刚刚测试过),但路径确实快得多。 – Code

+0

尝试只获取需要的标签并禁用解析到数组,在你的情况'exif_read_data($ img,'IFD0',false)' – maximkou

回答

2

你在整个blob中加载的事实就是为什么它需要这么长时间,所以你真的只需要加载包含exif数据的图像部分。

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

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

$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>'; 

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

+0

我想更好的解决方案是手动读取和解析文件,而不是使用'exif_read_data'。 – Code