улучшить качество сгенерированных изображений PHP GD - PullRequest
7 голосов
/ 14 сентября 2011

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

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

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

?>

Ответы [ 2 ]

14 голосов
/ 14 сентября 2011

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

imagejpeg($canvas, NULL, 90);

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

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

1019 *

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

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

1 голос
/ 14 сентября 2011

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

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

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

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

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

imagejpeg($canvas, NULL, $quality);

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

...