2012-07-04 113 views
5

我目前使用GD和一些PHP來旋轉圖像。每次旋轉後,圖像質量變差。有沒有更好的方法來做到這一點,或者這是預期的嗎?每次旋轉後PHP圖像旋轉失去質量

$img = new ImageClass; 
    list($original, $info) = $img->load($src); 

    // Determine angle 
    $angle = strtolower($angle); 
    if($angle == 'cw' || $angle == 'clockwise') $angle = 270; 
    if($angle == 'ccw' || $angle == 'counterclockwise') $angle = 90; 

    $rgb = $img->hex2rgb($bg_color); 
    $bg_color = imagecolorallocate($original, $rgb['r'], $rgb['g'], $rgb['b']); 

    $new = imagerotate($original, $angle, $bg_color); 

是否有可能旋轉圖像客戶端可能jQuery,然後通過PHP保存圖像到服務器?我假設這將有助於圖像質量。

回答

4

在我們的分享服務中,我們以不同的方式處理。我們始終保留原始圖像並存儲初始旋轉(0)。

旋轉後,加載原始圖像,根據旋轉+/- 90旋轉,並將副本寫入文件系統。之後數據庫用新的輪換進行更新。

儘管您在數據庫中還需要兩列,但對於旋轉和旋轉的複製位置。我還假設你總是進行初始大小調整(對於不同的大小可能是多個大小),這樣額外的列總是指向副本,而不是指向原始文件直到旋轉。

+0

這也是iPhoto的工作原理。 – dkamins

3

如果您在有限矩陣中旋轉圖像,則無法避免質量,服務器端或客戶端的降級,並且每次旋轉時都會添加這些降級。

如果您需要來自同一個旋轉圖像的許多旋轉圖像,則必須始終使用第一個(從未旋轉過的)圖像作爲源並增加角度而不是旋轉最後一次旋轉的圖像。

+0

事實上,當我法師通過JS或CSS旋轉客戶端,瀏覽器基本上做了傑克在他的回答中描述的內容。因此,您可以根據需要多次重新旋轉圖像,或者連續旋轉圖像,而不必擔心每增加一次旋轉就會降低圖像的分辨率。 –

+0

你也可以旋轉很多次相同的圖像客戶端... –

+0

任何建議的客戶端scrpts做這種事情? – Paul

1

每次保存JPG時,都會失去質量。這是一種「有損」的格式。如果您使用PNG,您可以隨意多次旋轉,無損品質,因爲它是「無損」格式。

+1

不會。保存爲jpeg確實會增加質量損失,但無法在不損壞質量的情況下旋轉圖像(除非在某些罕見情況下)。 –

1

幾點

  • 爲dystroy寫道,旋轉是有損壓縮壓縮圖像時
  • 客戶方旋轉通常不是圖像處理,但圖像對象的視圖中的旋轉,所以當你它發送到服務器,這將是原始圖像
  • ImageMagick的傳聞比GD上的轉換提供更好的結果(見http://de.php.net/imagick