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

问题描述

最近在项目中,需要后端进行图片合并。由于头像是圆形、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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,136评论 1 32
  • 文|过云雨 2018年,有一种朋友叫做老铁,一声老铁,拉进了彼此的距离。 在读书营的11个月,让我有了巨大的成长。...
    过云雨Milo阅读 268评论 0 1
  • 年龄改变不了你的容颜 但是可以改变你的思想 慢慢会发现自己不再和以前那样对感情抱有无限希望 你会把所有的心思都放在...
    毛竇竇阅读 96评论 0 0
  • 北洋大时代道德篇(一百一十七):岁月本长,而忙者自促;天地本宽,而鄙者自隘。 在北洋军阀中,奉系军阀的掌门人张作霖...
    拾文客栈阅读 1,769评论 5 13