2015-11-07 147 views
0

我有一個小的PHP腳本,它將圖像文件轉換爲縮略圖。我有一個100MB的最大上傳者,我想保留。獲取未壓縮的圖像大小

問題是,當打開文件時,GD解壓縮它,導致它很大,並導致PHP內存不足(Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 64000 bytes))。我不想增加我的記憶比這允許的大小。

我不關心圖像,我可以讓它顯示一個默認縮略圖,沒關係。但我確實需要一種方法來捕捉圖像太大時產生的錯誤imagecreatefromstring(file_get_contents($file))。由於生成的錯誤是致命的,因此無法嘗試捕獲,並且由於它將其加載到一個命令中,所以我無法繼續關注它以確保它不會接近極限。在嘗試處理圖像之前,我需要一種方法來計算圖像的大小。

有沒有辦法做到這一點? filesize不會工作,因爲它給了我壓縮後的大小...

我的代碼如下:

$image = imagecreatefromstring(file_get_contents($newfilename)); 
$ifilename = 'f/' . $string . '/thumbnail/thumbnail.jpg'; 

$thumb_width = 200; 
$thumb_height = 200; 

$width = imagesx($image); 
$height = imagesy($image); 

$original_aspect = $width/$height; 
$thumb_aspect = $thumb_width/$thumb_height; 

if ($original_aspect >= $thumb_aspect) 
{ 
    // Image is wider than thumbnail. 
    $new_height = $thumb_height; 
    $new_width = $width/($height/$thumb_height); 
} 
else 
{ 
    // Image is taller than thumbnail. 
    $new_width = $thumb_width; 
    $new_height = $height/($width/$thumb_width); 
} 

$thumb = imagecreatetruecolor($thumb_width, $thumb_height); 

// Resize and crop 
imagecopyresampled($thumb, 
        $image, 
        0 - ($new_width - $thumb_width)/2, // Center the image horizontally 
        0 - ($new_height - $thumb_height)/2, // Center the image vertically 
        0, 0, 
        $new_width, $new_height, 
        $width, $height); 
imagejpeg($thumb, $ifilename, 80); 

回答

0

試圖重新上漿之前看原始圖像的大小?也許把它乘以基於平均格式壓縮的設定百分比?

$averageJPGFileRatio = 0.55; 
$orgFileSize = filesize ($newfilename) * 0.55; 

並在做任何工作之前看這個?

二次想法

計算的話是這樣的:width * height * 3 = filesize 3是紅色,綠色和藍色的值,如果你處理圖像alpha通道的使用4,而不是3,這應該給你非常接近估計位圖大小。不考慮標題信息,但在幾個字節應該忽略不計。

+0

這似乎工作,非常感謝! – none