Don't enforce palette conversion when writing GD images

The GD image format is able to handle truecolor images as of libgd 2.0.12
(<https://github.com/libgd/libgd/blob/gd-2.2.3/src/gd_gd.c#L31-L33>).
Therefore we don't need the potentially lossy and time consuming palette
conversion.

This way, imagegd() can also be used to export raw truecolor image data.
This commit is contained in:
Christoph M. Becker 2016-09-24 14:44:57 +02:00
parent 96305b456b
commit d95b8eaf31
4 changed files with 36 additions and 6 deletions

View File

@ -95,6 +95,8 @@ PHP 7.2 UPGRADE NOTES
- GD:
. Removed --enable-gd-native-ttf configuration option which was unused as
of PHP 5.5.0 anyway.
. imagegd() stores truecolor images as real truecolor images. Formerly, they
have been converted to palette.
- Mbstring
. mb_check_encoding() accepts array parameter. Both key and value

View File

@ -2565,9 +2565,6 @@ static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char
(*func_p)(im, i, fp);
break;
case PHP_GDIMG_TYPE_GD:
if (im->trueColor){
gdImageTrueColorToPalette(im,1,256);
}
(*func_p)(im, fp);
break;
case PHP_GDIMG_TYPE_GD2:
@ -2619,9 +2616,6 @@ static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char
(*func_p)(im, q, tmp);
break;
case PHP_GDIMG_TYPE_GD:
if (im->trueColor) {
gdImageTrueColorToPalette(im,1,256);
}
(*func_p)(im, tmp);
break;
case PHP_GDIMG_TYPE_GD2:

View File

@ -0,0 +1,34 @@
--TEST--
imagegd() writes truecolor images without palette conversion
--SKIPIF--
<?php
if (!extension_loaded('gd')) die('skip gd extension not available');
?>
--FILE--
<?php
require_once __DIR__ . DIRECTORY_SEPARATOR . 'func.inc';
$im = imagecreatetruecolor(10, 10);
$white = imagecolorallocate($im, 255, 255, 255);
imagefilledrectangle($im, 0,0, 9,9, $white);
$blue = imagecolorallocate($im, 0, 0, 255);
imagefilledrectangle($im, 3,3, 6,6, $blue);
ob_start();
imagegd($im);
$buffer = ob_get_clean();
$header = unpack('nsignature/nwidth/nheight/Ctruecolor', $buffer);
printf("signature: %d\n", $header['signature']);
printf("truecolor: %d\n", $header['truecolor']);
printf("size: %d\n", strlen($buffer));
test_image_equals_file(__DIR__ . DIRECTORY_SEPARATOR . 'imagegd_truecolor.png', $im);
?>
===DONE===
--EXPECT--
signature: 65534
truecolor: 1
size: 411
The images are equal.
===DONE===

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 B