PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
本文实例讲述了PHP使用Imagick扩展实现图片合成,圆角处理功能。分享给大家供大家参考,具体如下:
需求:为用户生成特定的二维码,拉取用户的微信头像和特定的背景图合成一张用户专属海报
方法:采用PHP的Imagick扩展功能对图片进行合成处理。对微信头像进行圆角处理,然后压缩图片的质量
1.根据微信用户特定id生成专属二维码
publicstaticfunctiongetTicket($scene_id)
{
$qrcode='{"expire_seconds":2592000,"action_name":"QR_SCENE","action_info":{"scene":{"scene_id":$scene_id}}}';//二维码信息
$access_token=self::getToken();//公众号token,这个要获取自己公众号的
$getticket_url="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=$access_token";
$ticketinfo=self::request_by_curl($getticket_url,$qrcode);
return$ticketinfo['ticket'];//专属二维码的ticken
}
publicstaticfunctionrequest_by_curl($remote_server,$post_string='')
{
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$remote_server);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,"POST");
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_string);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_AUTOREFERER,1);
curl_setopt($ch,CURLOPT_HTTPHEADER,array("Expect:"));
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0(compatible;MSIE5.01;WindowsNT5.0)');
$content=curl_exec($ch);
curl_close($ch);
$reArr=json_decode($content,true);
return$reArr;
}
2、合成海报
publicfunctionCompositeImage($ticket,$wxnick,$userId)
{
$Qrcode=newImagick("https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=$ticket");
$Qrcode->setImageResolution(0.1,0.3);//设置图片分辨率
$QrcodeWH=$Qrcode->getImageGeometry();//获取源图片宽和高
if($QrcodeWH['width']>200){
$QrcodeW['width']=200;
$QrcodeH['height']=$QrcodeW['width']/$QrcodeWH['width']*$QrcodeWH['height'];
}else{
$QrcodeW['width']=$QrcodeWH['width'];
$QrcodeH['height']=$QrcodeWH['height'];
}
$Qrcode->thumbnailImage($QrcodeW['width'],$QrcodeWH['height'],true);//按照选定的比例进行缩放
//预先下载微信头像,再生成合成信息
$curl=curl_init($wxnick);
$wxnickpath="upload/wxnick/".$userId.".jpg";
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
$imageData=curl_exec($curl);
curl_close($curl);
$tp=@fopen($wxnickpath,'a');
fwrite($tp,$imageData);
fclose($tp);
$weixin=newImagick($wxnickpath);
$weixin->setImageResolution(0.1,0.3);
$weixin->roundCorners(360,360);//圆角处理
$wxWH=$weixin->getImageGeometry();
if($wxWH['width']>200){
$wxW['width']=200;
$wxH['height']=$wxW['width']/$wxWH['width']*$wxWH['height'];
}else{
$wxW['width']=$wxWH['width'];
$wxH['height']=$wxWH['height'];
}
$weixin->thumbnailImage($wxW['width'],$wxWH['height'],true);//等比例缩放
//创建一个Imagick对象,同时获取要处理的背景图/data/wenda/htdocs/upload
$poster=newImagick("/data/wenda/htdocs/upload/poster.png");
$posterWH=$poster->getImageGeometry();
$posterW['width']=$posterWH['width'];
$posterH['height']=$posterWH['height'];
//按照缩略图大小创建一个有颜色的图片
$canvas=newImagick();
$canvas->newImage($posterW['width'],$posterH['height'],'black','jpg');
//二维码微信头像背景合成
$poster->compositeImage($Qrcode,Imagick::COMPOSITE_OVER,275,960);
$poster->compositeImage($weixin,Imagick::COMPOSITE_OVER,275,402);
$canvas->compositeImage($poster,imagick::COMPOSITE_OVER,0,0);
$canvas->setImageCompressionQuality(60);//压缩质量
$canvas->writeImage("/upload/poster/$userId.jpg");//生成图片
return$canvas;//返回图片流信息
}
header("Content-Type:image/jpg");//输出图片
$posterimg=$this->CompositeImage($Fticket,$Fwnick,$userId);
echo$posterimg//输出图片
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP扩展开发教程》、《PHP网络编程技巧总结》、《phpcurl用法总结》、《PHP数组(Array)操作技巧大全》、《PHP图形与图片操作技巧汇总》及《php字符串(string)用法总结》
希望本文所述对大家PHP程序设计有所帮助。