imagetruecolortopalette игнорирует параметр цвета

Как создать изображение без потери всех цветов? Это создает изображение с крапинками, и изменение номера цвета не имеет значения. Изображение PNG, с которого я начал (загружено через PHP), намного четче.

//Create an image from the source
$srcImage = imagecreatefromstring( file_get_contents( $sourcePath ) );

//Get the source width and height
list( $width, $height ) = getimagesize( $sourcePath );

//Create image to paint on
$canvas = imagecreatetruecolor( $width, $height );

//Add alpha for transparency
$bga = imagecolorallocatealpha( $canvas, 0, 0, 0, 127 );
imagecolortransparent( $canvas, $bga );
imagefill( $canvas, 0, 0, $bga );

//Convert to palette (ignores the number of colors)
imagetruecolortopalette( $canvas, true, 1000 );

//Retain transparency
imagesavealpha( $canvas, true );

//Save as PNG to file
imagepng( $canvas, $destPath );

//Remove temporary data
imagedestroy( $canvas );

Как создать изображение с палитрой png с большим количеством цветов?


person Don Rhummy    schedule 04.10.2013    source источник
comment
истинно цветное изображение теоретически может иметь 16,7 миллионов различных цветов. вы разрешаете только 1000. Вы проверили, сколько уникальных кортежей r, g, b содержится в исходном? Если это >1000, то вы заставляете GD удалить ваше изображение.   -  person Marc B    schedule 04.10.2013
comment
@MarcB Я пробовал намного больше 1000, и это не имеет значения. Это также имеет такое же низкое качество (и тот же размер файла: 80,4 КБ): imagetruecolortopalette( $canvas, true, 16700000 ); Он игнорирует параметр цвета.   -  person Don Rhummy    schedule 05.10.2013
comment
@MarcB Есть идеи, как я могу заставить это работать?   -  person Don Rhummy    schedule 08.10.2013
comment
зачем вообще навязывать палитру? Просто сохраните png без палитры.   -  person Marc B    schedule 08.10.2013
comment
@MarcB, потому что это сохраняет изображение как слишком большое (500 КБ). Tinypng может сжимать изображение до 95 КБ и индексировать его без заметной потери качества. Я хочу сделать это с помощью PHP.   -  person Don Rhummy    schedule 08.10.2013
comment
Было бы очень хорошо, если бы параметр действительно работал. Этот обходной путь — просто переход к объекту изображения, который не является 24-битным истинным цветом — прилично экономит размер без потери качества. Проверьте это: stackoverflow.com/questions/5187480/   -  person Aaron Gillion    schedule 06.06.2015