2016-06-07 37 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