2011-09-14 70 views
7

我將開始使用GD庫在PHP中構建一個地圖生成器。我使用lib生成了一些圖像,但它們質量不好。我只是想知道,有什麼方法可以提高圖像的質量。提高PHP GD生成圖像的質量

所生成的圖像是:

the img

,我提出的代碼是:

<?php 

$canvas = imagecreate(800, 350); 

imagecolorallocate($canvas, 255, 255, 255); 

$pink = imagecolorallocate($canvas, 255, 105, 180); 
$white = imagecolorallocate($canvas, 255, 255, 255); 
$green = imagecolorallocate($canvas, 132, 135, 28); 

imagestring($canvas, 20, 290, 25, "Quality is not the best :(", $green); 
function drawlinebox($x1, $y1, $x2, $y2, $height, $color){ 
    global $canvas; 
    imagesetthickness ($canvas, 1); 
    for ($i=1; $i < $height; $i++){ 
     imageline($canvas, $x1, $y1, $x2, $y2, $color); 
     $y1++; $y2++; 
    } 
} 

drawlinebox(20, 20, 780, 300, 30, $green); 
drawlinebox(20, 300, 780, 20, 30, $pink); 
header('Content-Type: image/jpeg'); 
imagejpeg($canvas); 
imagedestroy($canvas); 

?> 
+0

嘗試使用'imagepng'而不是'imagejpeg'。 PNG('header('Content-Type:image/png');')可能是一個更好的格式。 –

+0

您是否嘗試過抗混疊功能? – kaiser

回答

14

imagejpeg[docs]花費的圖像質量的參數。它默認爲75,但您可以將其增加至最大值100。例如:

imagejpeg($canvas, NULL, 90); 

但是,對於具有大量連續顏色和尖銳線條的生成圖形,JPEG可能不是最佳選擇。 PNG更適合這些類型的圖像,並且可能會以更小的尺寸爲您提供完美的質量。 imagepng[docs]有幾個選項,但默認應罰款:

header('Content-Type: image/png'); 
imagepng($canvas); 

您使用imagecreate[docs],使擺在首位的圖像。這會創建一個「基於托盤的」圖像:只能使用有限數量的顏色的圖像。這與GIF或8位PNG的質量較低相匹配,但由於您不使用這些格式,因此應該使用imagecreatetruecolor[docs]。到目前爲止,您的圖像非常簡單,這可能沒有什麼區別,但是如果您生成更復雜的圖像,這很重要。

如果您進行了這兩項更改,您的圖片肯定會有完美的質量。

+2

此外,請嘗試'imagecreatetruecolor'而不是'imagecreate'。 –

+0

@nikc:好的建議,我已經添加到我的文章。 –

+0

非常感謝。 PNG似乎做得很好。 – Ameer

1

質量損失是由於JPEG壓縮(這是alossy壓縮算法)。

如果你想要最好的質量使用PNG而不是jpeg。

header('Content-Type: image/png'); 
imagepng($canvas); 

對於地圖生成器,我會推薦PNG,因爲有許多純色區域將被PNG壓縮很多。

只有在使用JPEG時,如果PNG圖像的大小不可接受地大。
在這種情況下,傑里米說,使用imagejpeg質量參數..

imagejpeg($canvas, NULL, $quality); 

我會用不同質量進行試驗,以找到一個合適的大小質量的權衡。就個人而言,我發現在大多數情況下90的質量是可以接受的,但如果您願意,可以將其提高到100。