2011-05-19 132 views
1

我使用調整圖像大小:imagecopyresampled有時創建空白影像

//load file and dimensions 
$obj_original_image = imagecreatefromjpeg($str_file_path); 
list($int_width, $int_height, $image_type) = getimagesize($str_file_path); 

//compress file 
$int_thumbnail_width = 320; 
$int_ratio = $int_thumbnail_width/$int_width; 
$int_new_width = $int_thumbnail_width; 
$int_new_height = $int_height * $int_ratio; 

$obj_image = imagecreatetruecolor($int_new_width, $int_new_height); 
imagecopyresampled($obj_image, $obj_original_image, 0, 0, 0, 0, $int_new_width,  $int_new_height, $int_width, $int_height); 
imagejpeg($obj_image, $GLOBALS['serverpath'] . '/images/uploaded/video-thumbs/'.$arr_data['thumbnail_folder'].'/' . $arr_data['id']. '.jpg', $int_compression = 85); 

,這是一般可以正常使用。但偶爾,它會產生一張空白的白色圖像。我已閱讀http://php.net/manual/en/function.imagecopyresampled.php

由於調色板圖像限制(255 + 1色)存在問題。對圖像進行重採樣或濾波通常需要比255更多的顏色,使用一種近似來計算新的重採樣像素及其顏色。使用調色板圖像我們嘗試分配一種新的顏色,如果失敗了,我們選擇最接近的(理論上)計算的顏色。這並不總是最接近的視覺顏色。這可能會產生一個奇怪的結果,如空白(或視覺空白)的圖像。爲了避免這個問題,請使用truecolor圖像作爲目標圖像,例如imagecreatetruecolor()創建的圖像。

但是,我已經使用imagecreatetruecolor。我總是縮放相同大小的圖像,因此它不能成爲寬度/高度問題。它只是有時會發生,大多數時候圖像縮放工作正常。任何想法如何解決這個問題?

回答

0

當您已經打開圖片imagecreatefromjpeg()時,沒有理由使用getimagesize()。您可以使用imagesx()imagesy()來獲取寬度/高度。 getimagesize與GD分開並重新打開圖像,重新解析圖像等等。

還要注意GD是非常愚蠢的,並且強制您確定您已獲取的圖像類型並調用相應的createfrom功能。如果您嘗試打開除.jpg圖像以外的其他任何內容,則imagecreatefromjpeg()將失敗。

$obj_original_image = imagecreatefromjpeg($str_file_path); 
if ($obj_original_image === FALSE) { 
    die("Unable to load $str_file_path. Not a jpg?"); 
} 

etc... etc... 

$status = imagecopyresampled($obj_image, $obj_original_image, 0, 0, 0, 0, $int_new_width,  $int_new_height, $int_width, $int_height); 

if ($status === FALSE) { 
    die("imagecopyresampled failed!"); 
} 

同樣,爲您的高度/寬度計算添加一些調試 - 輸出您生成的值。也許其中一個或多個出現爲0,所以最終重新採樣到一個不存在的大小。

+0

謝謝馬克B,獲取文件上的座標和有效點是一個JPG和寬度和高度的好建議。我知道它始終是jpg,不過因爲我剛剛將原始網絡攝像頭圖像捕獲保存爲jpg,因此在調整大小之前。 – Newmania 2011-05-21 08:53:25

0

您提到正在處理的圖像大小始終相同,但分辨率總是相同嗎?如果您正在使用的分辨率特別高的圖像,則根據我的經驗,您可能會因內存不足而產生空白圖像。如果是這樣的話,你可以嘗試通過在memory_limit參數下的php.ini中增加分配給PHP的內存量來修復它。據我所知,該值適用於圖像操作。

+0

謝謝,文件大小會因網絡攝像頭捕獲而有所不同(儘管我認爲應該是相同的解析度)。但有一點可以用盡內存,儘管我已經將memory_limit設置爲128M,所以我對此表示懷疑(原始jpg約爲80kb)。儘管(在文件內而不是在php.ini中,使用ini_set(「memory_limit」,「256M」);),但我希望這可能有所幫助。我現在也保存了原始的jpg圖像,而不僅僅是重新調整大小的圖像,所以如果這種情況再次發生,我會得到導致問題的原始文件,然後可以正確測試它。 – Newmania 2011-05-21 08:55:29