改善PHP GD生成的图片质量

7
我将使用GD库在PHP中开始构建地图生成器。我已经使用该库生成了一些图片,但它们的质量不够好。我只想知道是否有方法可以提高图片的质量。
生成的图片是: 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);

?>

尝试使用imagepng而不是imagejpeg。PNG(header('Content-Type: image/png');)可能是更好的格式。 - gen_Eric
你尝试过抗锯齿函数吗? - kaiser
2个回答

14

imagejpeg[文档]接受一个图片质量参数。默认情况下,它为75,但你可以将其增加到最大值100。例如:

imagejpeg($canvas, NULL, 90);

然而,对于大量连续颜色和清晰线条的生成图形,JPEG 可能不是最佳选择。PNG 更适合这些类型的图像,并且在更小的尺寸下可能会给您完美的质量。 imagepng[文档] 有一些选项,但默认值应该是可以的:

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

你在使用imagecreate[文档]创建图像。这将创建一个基于调色板的图像,只能使用有限数量的颜色。这与GIF或8位PNG的低质量相匹配,但由于你没有使用这些格式,所以应该改用imagecreatetruecolor[文档]。到目前为止,你的图像非常简单,可能不会有区别,但如果你生成更复杂的图像,这将很重要。

如果您进行这两个更改,您的图像将确保具有完美的质量。


2
另外,尝试使用imagecreatetruecolor而不是imagecreate - nikc.org
@nikc:好建议,我已经将其添加到我的帖子中。 - Jeremy
@Ameer:很好,很高兴能够帮到你。如果你认为问题已经解决,你应该考虑点击灰色的勾号标记,将最有帮助的答案标记为“接受”。 - Jeremy
1
imagecreatetruecolor() 返回黑色图像 :( - Michel

2

由于JPEG压缩算法是一种有损压缩算法,因此导致了图像质量的损失。

如果您想要最佳质量,请使用PNG而不是JPEG。

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

对于地图生成器,我建议使用PNG格式,因为其中有许多实心颜色区域,这些区域将会被PNG压缩。

只有在PNG图像的大小不可接受时才考虑使用JPEG。
在这种情况下,就像Jeremy所说的那样,使用imagejpeg的质量参数。

imagejpeg($canvas, NULL, $quality);

我会尝试不同的质量来找到适合的大小和质量之间的平衡。个人而言,我发现在大多数情况下,质量为90是可以接受的,但如果您想要更高的质量,可以提高到100。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接