2011-09-14 12 views
7

Ho intenzione di iniziare a costruire un generatore di mappe in PHP utilizzando la libreria GD. ho generato alcune immagini usando la lib ma non hanno una buona qualità. Voglio solo sapere che c'è un modo per migliorare la qualità delle immagini.migliorare la qualità delle immagini generate da GD PHP

L'immagine generata è:

the img

e il codice ho fatto è:

<?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

Prova a usare 'imagepng' invece di' imagejpeg'. PNG ('header ('Content-Type: image/png');') potrebbe essere un formato migliore. –

+0

Hai provato le funzioni antialiasing? – kaiser

risposta

14

imagejpeg[docs] prende un argomento per la qualità dell'immagine. Il valore predefinito è 75, ma è possibile aumentare fino a un massimo di 100. Per esempio:

imagejpeg($canvas, NULL, 90); 

Tuttavia, per la grafica generata con un sacco di colori continue e linee decise, JPEG non è probabilmente la scelta migliore. I PNG sono più adatti a questo tipo di immagini e probabilmente ti daranno una qualità perfetta con dimensioni più ridotte. imagepng[docs] ha alcune opzioni, ma i valori di default dovrebbe andare bene:

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

Stai usando imagecreate[docs] per rendere l'immagine in primo luogo. Ciò crea un'immagine "basata su pallet": una che può usare solo un numero limitato di colori. Ciò corrisponde alla qualità inferiore di una GIF o di un PNG a 8 bit, ma poiché non utilizzi questi formati, devi utilizzare invece imagecreatetruecolor[]. Finora, la tua immagine è molto semplice e questo potrebbe non fare la differenza, ma sarà importante se stai generando immagini più complicate.

Se si effettuano queste due modifiche, le immagini avranno una qualità perfetta.

+2

Inoltre, prova 'imagecreatetruecolor' invece di' imagecreate'. –

+0

@nikc: buon suggerimento, l'ho aggiunto al mio post. –

+0

grazie mille. PNG sembra fare un buon lavoro. – Ameer

1

La perdita di qualità è dovuta alla compressione JPEG (che è algoritmo di compressione alosa).

Se si desidera la migliore qualità, utilizzare PNG anziché jpeg.

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

E per un generatore di mappe vi consiglio PNG in quanto vi sono molte aree in tinta unita, che sarà compresso un bel po 'da PNG.

Pensare all'utilizzo di JPEG solo se le dimensioni delle immagini PNG sono eccessivamente grandi.
In tal caso, come Jeremy detto Utilizzare l'argomento qualità della imagejpeg ..

imagejpeg($canvas, NULL, $quality); 

Vorrei sperimentare con diverse qualità per trovare una adeguata qualità dimensione del trade-off. Personalmente ho trovato una qualità di 90 per essere accettabile nella maggior parte dei casi, ma puoi farlo fino a 100 se vuoi.

Problemi correlati