旋转PNG,然后使用图像透明度重新保存

时间:2012-11-24 10:14:07

标签: php rotation png transparent alpha

我在正在轮换的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 个答案:

答案 0 :(得分:12)

我在

下面添加了一个有效的评论版本
<?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 );

演示 来自Wikipedia

的原始图片

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

答案 1 :(得分: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