PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例


Posted in PHP onSeptember 09, 2019

本文实例讲述了PHP使用 Imagick 扩展实现图片合成,圆角处理功能。分享给大家供大家参考,具体如下:

需求:为用户生成特定的二维码 ,拉取用户的微信头像 和特定的背景图合成一张用户专属海报

方法:采用PHP的Imagick扩展功能对图片进行合成处理。对微信头像进行圆角处理,然后压缩图片的质量

1. 根据微信用户特定id生成专属二维码

public static function getTicket($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
}
public static function request_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; MSIE 5.01; Windows NT 5.0)');
    $content = curl_exec($ch);
    curl_close($ch);
    $reArr=json_decode($content,true);
    return $reArr;
}

2、 合成海报

public function CompositeImage ($ticket, $wxnick, $userId)
{
  $Qrcode = new Imagick("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 = new Imagick($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 = new Imagick( "/data/wenda/htdocs/upload/poster.png" );
 $posterWH = $poster->getImageGeometry();
 $posterW['width'] = $posterWH['width'];
 $posterH['height'] = $posterWH['height'];
 // 按照缩略图大小创建一个有颜色的图片
 $canvas = new Imagick();
 $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 相关文章推荐
将数字格式的计算结果转为汉字格式
Oct 09 PHP
linux下删除7天前日志的代码(php+shell)
Jan 02 PHP
php中用加号与用array_merge合并数组的区别深入分析
Jun 03 PHP
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
PHP生成Gif图片验证码
Oct 27 PHP
php中将一段数据存到一个txt文件中并显示其内容
Aug 15 PHP
php实现的简单检验登陆类
Jun 18 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
Jul 04 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
PHP实现动态执行代码的方法
Mar 25 PHP
yii2.0框架场景的简单使用示例
Jan 25 PHP
thinkphp5框架路由原理与用法详解
Feb 11 PHP
Yii框架常见缓存应用实例小结
Sep 09 #PHP
Yii框架函数简单用法分析
Sep 09 #PHP
Yii框架的路由配置方法分析
Sep 09 #PHP
PHP实现时间日期友好显示实现代码
Sep 08 #PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
Sep 08 #PHP
Yii框架连表查询操作示例
Sep 06 #PHP
Laravel框架中缓存的使用方法分析
Sep 06 #PHP
You might like
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
windows系统php环境安装swoole具体步骤
2021/03/04 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
JS的replace方法详细介绍
2012/11/09 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
对vue中v-on绑定自定事件的实例讲解
2018/09/06 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
一个SQL面试题
2014/08/21 面试题
测试时代收集的软件测试面试题
2013/09/25 面试题
旅游网创业计划书
2014/01/31 职场文书
供电工程专业求职信
2014/08/09 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
医生见习报告范文
2014/11/03 职场文书
公积金贷款承诺书
2015/04/30 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
大学生就业指导课心得体会
2016/01/15 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang