|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-03-01 14:56 UTC] efbiaiinzinz at hotmail dot com
Description:
------------
When issuing imagegammacorrect function on an image resource that has alpha
channel, the alpha channel gets lost.
I looked at the source of 5.4.0RC8 and have also made a minor patch that adds
alpha channel support by modifying the ext/gd/gd.c file.
Test script:
---------------
$img = imagecreatefrompng('input.png');
imagegammacorrect($img, 1.0, 1.0);
imagepng($img, 'result.png');
Expected result:
----------------
I would expect to see output.png retain its alpha channel.
Actual result:
--------------
The result file does not have any transparency, since the current source code
indeed does not do gamma correction to alpha channel.
Patchesimagegammacorrect-alpha (last revision 2015-06-06 00:45 UTC by cmb@php.net)gd.patch (last revision 2012-03-01 14:57 UTC by efbiaiinzinz at hotmail dot com) Pull Requests
Pull requests:
HistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 20:00:01 2025 UTC |
In the original proposed patch, alpha shannel should not actually be modified by imagegammacorrect, only rgb should get multiplied. Sample test case to show alpha channel loss: <?php $imagew = 50; $imageh = 50; //truecolor means color allocations just combine ARGB into one integer value $img = imagecreatetruecolor($imagew, $imageh); //make sure alpha gets stored imagesavealpha($img, true); $blacktransparent = imagecolorallocatealpha($img, 0, 0, 0, 127); $redsolid = imagecolorallocate($img, 255, 0, 0); //fill with transparent black background imagefill($img, 0, 0, $blacktransparent); //draw solid red cross over the image for contrast imageline($img, $imagew / 2, 0, $imagew / 2, $imageh - 1, $redsolid); imageline($img, 0, $imageh / 2, $imagew - 1, $imageh / 2, $redsolid); //execute imagecammacorrect with same input-/output gamma values so that colors should actually remain same imagegammacorrect($img, 1, 1); //ask top-left corner color, for truecolor it is ARGB combined into one integer value $color = imagecolorat($img, 0, 0); //correct result should be same black-based transparent color that we used for filling echo $color === $blacktransparent ? 'ok' : 'failure'; //comment the echo line above and uncomment the two lines below to see visually how transparent color gets changed to solid black //header('Content-Type: image/png'); //imagepng($img); imagedestroy($img);