美文网首页
PHP PNG图片合并 透明背景问题解决

PHP PNG图片合并 透明背景问题解决

作者: KoPa | 来源:发表于2019-08-29 11:57 被阅读0次

    问题描述

    最近在项目中,需要后端进行图片合并。由于头像是圆形、png格式,合并到背景图片后会出现四个黑角或白边的情况。
    

    解决方法

    为添加透明通道信息
    

    代码如下:
    图片切成圆形
    url 为图片路径path 为存储路径

     function cutCirle($url){
            $path = public_path('/uploads/public/code_'.time().'.png');
            $w = 110;  $h=110; // original size
            $original_path= $url;
            $dest_path = $path.uniqid().'.png';
            $src = imagecreatefromstring(file_get_contents($original_path));
            $newpic = imagecreatetruecolor($w,$h);
            imagealphablending($newpic,false);
            $transparent = imagecolorallocatealpha($newpic, 0, 0, 0, 127);
            $r=$w/2;
            for($x=0;$x<$w;$x++)
                for($y=0;$y<$h;$y++){
                    $c = imagecolorat($src,$x,$y);
                    $_x = $x - $w/2;
                    $_y = $y - $h/2;
                    if((($_x*$_x) + ($_y*$_y)) < ($r*$r)){
                        imagesetpixel($newpic,$x,$y,$c);
                    }else{
                        imagesetpixel($newpic,$x,$y,$transparent);
                    }
                }
            imagesavealpha($newpic, true);
            imagepng($newpic, $dest_path);
            imagedestroy($newpic);
            imagedestroy($src);
            // unlink($url);
            return $dest_path;
        }
    

    图片合并及添加透明通道信息

    /**
        $dst是背景图片
    */
            $getHead = $this->headImg(cutCirle);
            list($head_w,$head_h) = getimagesize($getHead['resize']); //获取长宽
            $headImg = imagecreatefrompng($getHead['resize']); 
            $dst_im = imagecreatetruecolor($head_w, $head_h); //创建画报
            $bg = imagecolorallocatealpha($dst_im,0,0,0,127); //alpha色
            imagealphablending($dst_im,false);
            imagefill($dst_im,0,0,$bg);//4.填充透明色
            imagecopyresized($dst_im, $headImg, 0, 0, 0, 0, $head_w, $head_h, $head_w, $head_h); //头像与画报合并
            //用户头像
         imagecopyresized($dst,$dst_im,72,30,0,0,imagesx($dst_im),imagesy($dst_im),imagesx($dst_im),imagesy($dst_im));
            imagesavealpha($dst_im,true);//重要!!与背景图片合并后,需要保存alpha
    

    相关文章

      网友评论

          本文标题:PHP PNG图片合并 透明背景问题解决

          本文链接:https://www.haomeiwen.com/subject/enxiectx.html