go to bug id or search bugs for
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.
// create fully transparent canvas
$canvas = imagecreatetruecolor(200,200);
$trans_colour = imagecolorallocatealpha($canvas, 0, 0, 0, 127);
imagefill($canvas, 0, 0, $trans_colour);
// rotate the canvas 45 degrees
$outputCanvas = imagerotate($canvas, 45, imageColorAllocateAlpha($canvas, 0, 0, 0, 127),0);
// replace colors not being fully transparent
$blue_color = imageColorAllocateAlpha($outputCanvas, 0, 0, 255, 0);
$width = imagesx($outputCanvas);
$height = imagesy($outputCanvas);
$rgb = imagecolorat($outputCanvas, $x, $y);
if ($rgb != 0x7F000000)
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.
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.
Add a Patch
Add a Pull Request
I can confirm this issue for latest bundled GD, and also that
external libgd is not affected.
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.
Yes, that is definitely a precision issue. Switching to double
arithmetic almost solves the issue on my machine (still, several
alpha values would be off).
Pierre, it seems to me that the 8-bit shift is simply not
sufficient to have the desired precision (particular with regard
to the trigonometric functions). On the other hand, there *might*
already be issues on 32-bit Windows, where a long has only 32 bit.
Why has this ticket been closed? Has the issue been resolved?
My apologies cmb@, it was a misclick. I re-opened it