улучшить качество генерируемых изображений PHP GD

Я собираюсь начать создание генератора карт в PHP с помощью библиотеки GD. Я сгенерировал некоторые изображения, используя lib, но у них нет хорошего качества. Я просто хочу знать, что есть способ улучшить качество изображений.

Сгенерированное изображение:

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

Related of "улучшить качество генерируемых изображений PHP GD"

imagejpeg [ docs ] принимает аргумент для качества изображения. По умолчанию он равен 75 , но вы можете увеличить его до 100 . Например:

 imagejpeg($canvas, NULL, 90); 

Однако для сгенерированной графики с большим количеством непрерывных цветов и четких линий JPEG, вероятно, не самый лучший выбор. PNG более подходят для этих видов изображений и, вероятно, дадут вам идеальное качество при меньших размерах. imagepng [ docs ] имеет несколько параметров, но значения по умолчанию должны быть точными:

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

Вы используете imagecreate [ docs ], чтобы сделать изображение в первую очередь. Это создает «образ на основе поддонов»: тот, который может использовать только ограниченное количество цветов. Это соответствует более низкому качеству GIF или 8-битного PNG, но поскольку вы не используете эти форматы, вместо этого вы должны использовать imagecreatetruecolor [ docs ] . Пока что ваш образ очень прост, и это может не повлиять, но это будет иметь значение, если вы создадите более сложные изображения.

Если вы сделаете эти два изменения, ваши изображения обязательно будут иметь отличное качество.

Потеря качества связана с сжатием JPEG (что является алгоритмом алгоритма сжатия).

Если вы хотите, чтобы лучшее качество использовало PNG вместо jpeg.

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

А для генератора карт я бы рекомендовал PNG, поскольку есть много сплошных цветовых областей, которые PNG сжимает довольно много.

Только подумайте об использовании JPEG, если размер изображений PNG недопустимо большой.
В этом случае, как сказал jeremy, используйте аргумент качества imagejpeg ..

 imagejpeg($canvas, NULL, $quality); 

Я бы экспериментировал с различными качествами, чтобы найти подходящий компромисс качества. Лично я нашел качество 90, чтобы быть приемлемым в большинстве случаев, но вы можете увеличить его до 100, если хотите.