2011-09-14 8 views
7

GDライブラリを使用してPHPでマップジェネレータを構築する予定です。私はlibを使用していくつかの画像を生成しましたが、それらは良い品質を持っていません。私は、画像の品質を改善する方法があることを知りたいだけです。PHP GD生成画像の品質を改善する

生成された画像である。

the img

iがなさコードである:

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

「imagejpeg」ではなく「imagepng」を使用してください。 PNG( 'header( 'Content-Type:image/png');')はより良いフォーマットかもしれません。 –

+0

アンチエイリアス機能を試しましたか? – kaiser

答えて

14

imagejpeg[docs]画質の引数を取ります。デフォルトは75ですが、最大で100まで増やすことができます。例:

imagejpeg($canvas, NULL, 90); 

ただし、連続した色と鮮明な線が多数生成されたグラフィックスでは、おそらくJPEGが最適ではありません。 PNGはこれらの種類の画像に適しており、小さなサイズで完璧な品質を提供します。 imagepng[docs]は、いくつかのオプションがありますが、デフォルトは問題ないはずです:あなたが最初の場所で画像を作るためにimagecreate[docs]を使用している

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

。これにより、限られた数の色しか使用できないパレットベースの画像が作成されます。これは、GIFまたは8ビットPNGの低品質に一致しますが、これらの形式を使用していないため、代わりにimagecreatetruecolor[docs]を使用する必要があります。これまでのところ、あなたのイメージは非常にシンプルで、違いはありませんが、より複雑なイメージを生成しているかどうかは重要です。

この2つの変更を行った場合、画像は完全な品質になります。

+2

また、 'imagecreate'ではなく' imagecreatetruecolor'を試してください。 –

+0

@nikc:良い提案、私はそれを私の投稿に追加しました。 –

+0

ありがとうございます。 PNGは良い仕事をしているようです。 – Ameer

1

JPEG圧縮(アロッシ圧縮アルゴリズム)の品質の低下が原因です。

最高の品質を望む場合は、jpegではなくPNGを使用してください。

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

マップジェネレータでは、PNGによってかなり圧縮される多くのソリッドカラー領域があるため、PNGをお勧めします。

PNG画像のサイズが許容できないほど大きい場合は、JPEGを使用すると考えてください。その場合
ジェレミーはimagejpegの品質の引数を使用して言ったように...

imagejpeg($canvas, NULL, $quality); 

私は適当な大きさの品質のトレードオフを見つけるために、様々な資質を試すだろう。個人的には、ほとんどの場合、90の品質が受け入れられると判断しましたが、100にすることができます。

関連する問題