Улучшить качество сгенерированных изображений PHP GD
Я собираюсь начать создавать генератор карт в PHP с использованием библиотеки GD. Я сгенерировал несколько изображений, используя lib, но они не имеют хорошего качества. Я просто хочу знать, что есть какой-то способ улучшить качество изображений.
Сгенерированное изображение:
и код, который я сделал:
<?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);
?>
2 ответа
imagejpeg
[ документы] принимает аргумент в пользу качества изображения. По умолчанию 75
, но вы можете увеличить его до максимума 100
, Например:
imagejpeg($canvas, NULL, 90);
Однако для сгенерированной графики с множеством непрерывных цветов и четких линий JPEG, вероятно, не лучший выбор. PNG лучше подходят для такого рода изображений и, вероятно, дадут вам идеальное качество при меньших размерах. imagepng
У [ docs] есть несколько опций, но по умолчанию все должно быть в порядке:
header('Content-Type: image/png');
imagepng($canvas);
Вы используете imagecreate
[ документы], чтобы сделать изображение в первую очередь. Это создает изображение на основе паллет: оно может использовать только ограниченное количество цветов. Это соответствует низкому качеству GIF или 8-битного PNG, но поскольку вы не используете эти форматы, вы должны использовать imagecreatetruecolor
[ документы] вместо. Пока что ваше изображение очень простое, и это может не иметь значения, но это будет иметь значение, если вы создаете более сложные изображения.
Если вы сделаете эти два изменения, ваши изображения обязательно будут отличного качества.
Потеря качества является следствием сжатия JPEG (алгоритм сжатия с ошибками).
Если вы хотите лучшего качества, используйте PNG вместо JPEG.
header('Content-Type: image/png');
imagepng($canvas);
А для генератора карт я бы порекомендовал PNG, так как есть много областей сплошного цвета, которые будут сильно сжаты PNG.
Думайте об использовании JPEG только в том случае, если размер изображений PNG недопустимо велик.
В этом случае, как сказал Джереми, используйте аргумент качества imagejpeg
..
imagejpeg($canvas, NULL, $quality);
Я бы поэкспериментировал с различными качествами, чтобы найти подходящий размер компромисса. Лично я нашел качество 90 приемлемым в большинстве случаев, но вы можете увеличить его до 100, если хотите.