Bugs php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login

go to bug id or search bugs for

Bug #45030 Destination image alpha channel noise when using imagecopyresampled
Submitted: 2008年05月17日 21:43 UTC Modified: 2008年07月31日 09:22 UTC
From: lieyang at yahoo dot com Assigned: pajoye (profile)
Status: Closed Package: GD related
PHP Version: 5.2.6 OS: x86_64 GNU/Linux Kernel 2.6.9-4
Private report: No CVE-ID: None
[2008年05月17日 21:43 UTC] lieyang at yahoo dot com
Description:
------------
When resizing a 24 bit png image with imagecopyresampled, the destination image alpha channel contains noise where it should be completely transparent. When the re-sized image is displayed on Motorola phones with only 4 levels of transparency, 
the image shows many dark dots.
If we replace imagecopyresampled with imagecopyresized in the following sample reproduce code, the problem goes away.
Reproduce code:
---------------
 
$imageSrc = imagecreatefromstring($imageData);
$imageDst = imagecreatetruecolor($width, $height);
imagealphablending($imageDst, false);
$color = imagecolorallocatealpha($imageDst, 0, 0, 0, 127);
imagefill($imageDst, 0, 0, $color);
imagesavealpha($imageDst, true);
imagecopyresampled($imageDst,$imageSrc,	$dst_x, $dst_y,	$src_x, $src_y,	$dst_w, $dst_h,	$src_w, $src_h);
Expected result:
----------------
Completely transparent regions should still be completely transparent in destination image.
Actual result:
--------------
Destination image alpha channel noise (some pixel values that should be fully transparent have different value "2").
You can see the noise all over the transparent regions with any graphics tools (for example, color selection with gimp).

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
[2008年05月17日 22:43 UTC] pajoye@php.net
Please provide me the source image and the result you get. You can use http://bugs.libgd.org as well as you can add attachments to your report.
[2008年05月17日 22:48 UTC] pajoye@php.net
no need for src images :-)
[2008年05月17日 22:52 UTC] pajoye@php.net
In fact yes, I need the source image (what you have in $imageData). Sorry for the double posts.
[2008年05月17日 23:11 UTC] rasmus@php.net
We need a better reproducible example here, including the source image. When the source image has a perfect alpha channel, I see no noise. Try this:
$imageSrc = imagecreatetruecolor(500, 500);
imagealphablending($imageSrc, false);
imagesavealpha($imageSrc, true);
$color = imagecolorallocatealpha($imageSrc, 0, 0, 0, 127);
imagefill($imageSrc, 0, 0, $color);
$imageDst = imagecreatetruecolor(50, 50);
imagealphablending($imageDst, false);
imagesavealpha($imageDst, true);
imagecopyresampled($imageDst,$imageSrc, 0, 0, 0, 0, 50, 50, 500, 500);
header('Content-type: image/png');
imagepng($imageDst);
[2008年05月18日 03:41 UTC] lieyang at yahoo dot com
Please try the following with different image sizes and you will see that the alpha channel has noise.
(I have two original before and after images but can not find the link to upload them as attachments)
$imageSrc = imagecreatetruecolor(90, 90);
imagealphablending($imageSrc, false);
imagesavealpha($imageSrc, true);
$color = imagecolorallocatealpha($imageSrc, 0, 0, 0, 127);
imagefill($imageSrc, 0, 0, $color);
$imageDst = imagecreatetruecolor(56, 56);
imagealphablending($imageDst, false);
imagesavealpha($imageDst, true);
imagecopyresampled($imageDst,$imageSrc, 0, 0, 0, 0, 56, 56, 90, 90);
header('Content-type: image/png');
imagepng($imageDst);
[2008年05月18日 03:51 UTC] lieyang at yahoo dot com
Here are my test source image (png 90x90): http://tinyurl.com/65tdtm
Resized to 56x56 with noise in alpha channel: http://tinyurl.com/6yold7
[2008年05月18日 10:29 UTC] pajoye@php.net
The 56x56 image looks perfectly fine to me. I also checked the alpha values for the translucent areas and they look fine too (full translucent when they are not near the star anti aliased pixels, as expected).
To see how is the alpha channel in the result image, please look at this zoomed version of the alpha channel only:
http://pierre.libgd.org/bugs/45030_alpha_only.png
100% black means opaque and the gray squares are only to show a background (what would be behind the image). As you can see, there is no noise in the transparent areas.
Are you sure that there is not a bug in the Motorola display system? Maybe it does not support semi transparent pixels.
[2008年05月18日 16:14 UTC] lieyang at yahoo dot com
You can see the noise on both my 56x56 image and image generated from Rasmus's reproducing code sample with resizing from 90x90 to 50x50 (I am not talking about the anti-aliasing areas :)
GIMP: Tools > Selection Tools > By Color select, click a few spots in the empty region of the image and you will see the noise being selected.
Paint.net: use the color select tool and click a few times on the empty region of the image, some pixels will display the transparency as 2.
(thank you so much for your quick response!)
[2008年05月18日 18:12 UTC] pajoye@php.net
Right, there is a alpha values between 0 and 2. This is a little rounding issue in the interpolation function.
As it is not relevant when you use the full range of the 8bit (7bit in gd 2.0.x internals), it could cause some troubles when you introduce more errors while using only 4bits. 
The worst case will end with an error twice bigger than the original one. That's certainly why you see the little black pixels.
Here is an attempt to minimize the error in the edge of the alpha values:
http://pierre.libgd.org/patches/bug45030.txt
It should fix non obvious errors like the one you had.
[2008年05月29日 21:07 UTC] lieyang at yahoo dot com
We have verified the fix resolved our problem. Thank you very much! Do you have any estimate on when the fix will make into the stable branch?
[2008年07月13日 16:22 UTC] jani@php.net
Pierre, the fix worked, commit?
[2008年07月31日 09:22 UTC] rasmus@php.net
Applied.
PHP Copyright © 2001-2025 The PHP Group
All rights reserved. Last updated: Thu Sep 04 02:00:01 2025 UTC

AltStyle によって変換されたページ (->オリジナル) /