旋转PNG图像并带有图片透明度重新保存

4

我在旋转PNG文件时遇到了一些严重的问题,无法实现PNG透明度。

$filename = 'bird_up.png';
$source = imagecreatefrompng($filename) or die('Error opening file '.$filename);
imagealphablending($source, false);
imagesavealpha($source, true);
$rotation = imagerotate($source, $degrees, imageColorAllocateAlpha($source, 0, 0, 0, 127));
imagealphablending($source, false);
imagesavealpha($source, true);
header('Content-type: image/png');
imagepng($rotation);
imagedestroy($source);
imagedestroy($rotation);
2个回答

14
我已经在下面添加了一个可用的注释版本。
<?php
// this file writes the image into the http response,
// so we cant have any output other than headers and the file data
ob_start();

$filename       = 'tibia.png';
$degrees        = 45;

// open the image file
$im = imagecreatefrompng( $filename );

// create a transparent "color" for the areas which will be new after rotation
// r=0,b=0,g=0 ( black ), 127 = 100% transparency - we choose "invisible black"
$transparency = imagecolorallocatealpha( $im,0,0,0,127 );

// rotate, last parameter preserves alpha when true
$rotated = imagerotate( $im, $degrees, $transparency, 1);

// disable blendmode, we want real transparency
imagealphablending( $rotated, false );
// set the flag to save full alpha channel information
imagesavealpha( $rotated, true );

// now we want to start our output
ob_end_clean();
// we send image/png
header( 'Content-Type: image/png' );
imagepng( $rotated );
// clean up the garbage
imagedestroy( $im );
imagedestroy( $rotated );

演示 来自维基百科的原始图像

That's the original from wikipedia

旋转-45度,新区域以约50%的不透明度进行演示

$transparency = imagecolorallocatealpha( $im,0,0,0,55 );

rotated 45 degrees, new areas with ~50% opacity for a demo

旋转-45度,新区域透明度为100%。
$transparency = imagecolorallocatealpha( $im,0,0,0,127 );

rotated 45 degress, new areas with 100% opacity


这对于90/180度非常有效,但是45/90度之外的角度,例如37度等仍然会出现问题。有什么想法吗? - John Rake
抱歉,imagecolorallocatealpha函数有一个打字错误。现在已经更正了(图像资源参数是第一个)。 - Michel Feldheim
啊 - 那就接近了很多 - 现在唯一的问题是它似乎认为盒子仍然存在,这是 alpha,有没有办法在最后修剪它? - John Rake
如果需要的话,我也可以给它一个固定的宽度/高度,这样会更容易吗? - John Rake
可见或不可见 - 你所说的“盒子”只是图像数据。当然,在旋转后,您可以裁剪或调整大小。 - Michel Feldheim

0

<?php
            $text ="New"; $font = "fonts/AARDV.ttf"; $size = 100;
            function html2rgb()
            {
                $color='FF0000';
                if(strlen($color)==6) 
                list($r, $g, $b)=array($color[0].$color[1],$color[2].$color[3],$color[4].$color[5]);
                elseif (strlen($color) == 3)  
                list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]);
                else 
                return false; 
                $r = hexdec($r); 
                $g = hexdec($g); 
                $b = hexdec($b); 
                return array($r, $g, $b);
            }
            $c=html2rgb(); 
            $bbox = imagettfbbox($size, 0, $font, $text); 
            $width = abs($bbox[2] - $bbox[0]); 
            $height = abs($bbox[7] - $bbox[1]);
            $image = imagecreatetruecolor($width, $height);
            $bgcolor = imagecolorallocate($image, 1, 1,0);
            imagecolortransparent($image, $bgcolor);
            $color = imagecolorallocate($image, $c[0],$c[1],$c[2]);
            $x = $bbox[0] + ($width / 2) - ($bbox[4] / 2); 
            $y = $bbox[1] + ($height / 2) - ($bbox[5] / 2);
            imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $bgcolor);
            imagettftext($image, $size, 0, $x, $y, $color, $font, $text); 
            $last_pixel= imagecolorat($image, 0, 0);
            for ($j = 0; $j < $height; $j++) 
            { 
                for ($i = 0; $i < $width; $i++)
                {
                    if (isset($blank_left) && $i >= $blank_left) 
                    {
                        break;      
                    } 
                    if (imagecolorat($image, $i, $j) !== $last_pixel)
                    {
                        if (!isset($blank_top))
                        {
                            $blank_top=$j;
                        }
                        $blank_left=$i;break;
                    }
                    $last_pixel=imagecolorat($image, $i, $j);
                }
            }

            $x -= $blank_left;
            $y -= $blank_top;
            imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $bgcolor);
            imagettftext($image, $size, 0, $x, $y, $color, $font, $text);
            header('Content-type: image/png'); 
            $transparency = imagecolorallocatealpha( $image,0,0,0,127 );
            $image=imagerotate($image, 10,  $transparency, 1);
            imagealphablending( $image, false );
            imagesavealpha( $image, true );
            ob_end_clean();
            imagepng($image);
            imagedestroy($image);
            ?>

            This one not work..Black color
            any one please answer this..


            enter code here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接