2011-09-14 4 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

'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

또한,'imagecreate' 대신'imagecreatetruecolor'를 시도하십시오. –

+0

@nikc : 좋은 제안, 나는 그것을 내 게시물에 추가했습니다. –

+0

대단히 감사합니다. PNG는 좋은 일을하는 것처럼 보입니다. – Ameer

1

품질 저하는 JPEG 압축 (압축 압축 알고리즘)으로 인한 것입니다.

최상의 품질을 원하면 jpeg 대신 PNG를 사용하십시오.

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

지도 생성기의 경우 PNG로 상당히 압축 될 많은 단색 영역이 있으므로 PNG를 권장합니다.

PNG 이미지의 크기가 허용 할 수 없을만큼 큰 경우에만 JPEG를 사용하는 것으로 생각하십시오. 제레미 그 경우
내가 적당한 크기 품질 절충을 찾기 위해 다양한 자질을 실험 할

imagejpeg($canvas, NULL, $quality); 

.. imagejpeg의 품질 인수를 사용했다. 개인적으로 대부분의 경우 수용 할 수있는 90의 품질을 찾았지만 원할 경우 100까지 올릴 수 있습니다.