Edit report at https://bugs.php.net/bug.php?id=68629&edit=1
ID: 68629
Updated by: cmb@php.net
Reported by: bas5winkel at gmail dot com
Summary: Transparent artifacts when using imagerotate
Status: Verified
Type: Bug
Package: GD related
Operating System: Windows7
PHP Version: 5.5Git-2014-12-19 (Git)
Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
The reason for the different behavior is that PHP's bundled libgd
has optimized implementations for IMG_BILINEAR_FIXED and
IMG_BICUBIC_FIXED, which the external libgd has not yet. However,
apparently both implementations have a bug wrt. to alpha (might be
rounding issues). Anyhow, setting the interpolation method to
IMG_BICUBIC, for instance, gives the desired result.
Previous Comments:
------------------------------------------------------------------------
[2016-09-14 14:28:52] cmb@php.net
I can confirm this issue for latest bundled GD, and also that
external libgd is not affected.
------------------------------------------------------------------------
[2014-12-19 14:12:55] bas5winkel at gmail dot com
Description:
------------
---
From manual page: http://www.php.net/function.imagerotate
---
Linux (RHEL6+PHP5.3.3) works fine.
But with WAMP (Windows7+PHP5.5.12) transparent artifacts appear when using imagerotate.
The artifacts appear only in the transparent area of the image that is rotated.
The transparent aera should only contain pixels with the color code 0X7F000000 but a
'grid'-like pattern of pixels with color code 0x7E000000 appears.
(the alpha channel value should be 127 but some pixels become 126).
In the test script I have replaced the incorrect pixels with a non transparent color to show the
pattern.
Test script:
---------------
<?PHP
// create fully transparent canvas
$canvas = imagecreatetruecolor(200,200);
imagesavealpha($canvas, true);
$trans_colour = imagecolorallocatealpha($canvas, 0, 0, 0, 127);
imagefill($canvas, 0, 0, $trans_colour);
imagesavealpha($canvas, true);
// rotate the canvas 45 degrees
$outputCanvas = imagerotate($canvas, 45, imageColorAllocateAlpha($canvas, 0, 0, 0, 127),0);
imagealphablending($outputCanvas, false);
imagesavealpha($outputCanvas, true);
// replace colors not being fully transparent
$blue_color = imageColorAllocateAlpha($outputCanvas, 0, 0, 255, 0);
$width = imagesx($outputCanvas);
$height = imagesy($outputCanvas);
for($y=0;$y<$height;$y++)
{
for($x=0;$x<$width;$x++)
{
$rgb = imagecolorat($outputCanvas, $x, $y);
if ($rgb != 0x7F000000)
{
imagesetpixel($outputCanvas,$x,$y,$blue_color);
}
}
}
header("Content-Type: image/png");
imagepng($outputCanvas);
imagedestroy($canvas);
imagedestroy($outputCanvas);
?>
Expected result:
----------------
The script rotates a fully transparent image and should show a fully transparent image (shown as a
grey image in most browsers).
Pixels that are not fully transparent are colored blue.
No blue pixels should be visible.
Actual result:
--------------
When running the script on windows7 (wamp2.5-PHP5.5.12),
a grid like grey/blue pattern appears which shows that most fully transparent pixels have become not
fully transparent during the rotation.
I replaced the pixels that are not correct with a blue color in order to visualize the pattern.
All pixels should have a alpha value of 127 but somehow most of them become 126.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=68629&edit=1