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 相关文章推荐
php获取mysql数据库中的所有表名的代码
Apr 23 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
Sep 04 PHP
php分页代码学习示例分享
Feb 20 PHP
PHP基于imap获取邮件实例
Nov 11 PHP
PHP学习笔记(二):变量详解
Apr 17 PHP
php封装好的人民币数值转中文大写类
Dec 20 PHP
php简单复制文件的方法
May 09 PHP
PHP解析url并得到url参数方法总结
Oct 11 PHP
PHP反射学习入门示例
Jun 14 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 PHP
php使用Swoole实现毫秒级定时任务的方法
Sep 04 PHP
利用ajax+php实现商品价格计算
Mar 31 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生成静态页面教程
2012/01/10 PHP
php读取excel文件的简单实例
2013/08/26 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
PHP的PDO大对象(LOBs)
2019/01/27 PHP
原型方法的不同写法居然会影响调试的解决方法
2007/03/08 Javascript
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
js 实现菜单上下显示附效果图
2013/11/21 Javascript
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
jquery判断对象是否为空并遍历对象的简单实例
2016/07/26 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
2017/02/27 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
python网络编程示例(客户端与服务端)
2014/04/24 Python
使用Python进行目录的对比方法
2018/11/01 Python
详解Python传入参数的几种方法
2019/05/16 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
用python-webdriver实现自动填表的示例代码
2021/01/13 Python
写自荐信有哪些不宜?
2013/10/17 职场文书
人事专员的职责
2014/02/26 职场文书
电气工程自动化求职信
2014/03/14 职场文书
运动会方队口号
2014/06/07 职场文书
2014年食堂工作总结
2014/11/20 职场文书
2014年销售员工作总结
2014/12/01 职场文书
暖春观后感
2015/06/08 职场文书
vue实现移动端div拖动效果
2022/03/03 Vue.js