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中定义网站根目录的常用方法
Aug 08 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
Jul 02 PHP
php cookie名使用点号(句号)会被转换
Oct 23 PHP
PHP获取一年中每个星期的开始和结束日期的方法
Feb 12 PHP
PHP代码实现爬虫记录――超管用
Jul 31 PHP
php版微信公众号自定义分享内容实现方法
Sep 22 PHP
php微信公众平台开发(一) 配置接口
Dec 06 PHP
浅谈关于PHP解决图片无损压缩的问题
Sep 01 PHP
PHP实现通过二维数组键值获取一维键名操作示例
Oct 11 PHP
KindEditor在php环境下上传图片功能集成的方法示例
Jul 20 PHP
PHP解决高并发的优化方案实例
Dec 10 PHP
PHP isset empty函数相关面试题及解析
Dec 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
基于文本的搜索
2006/10/09 PHP
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
PDO::rollBack讲解
2019/01/29 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
js对象的比较
2011/02/26 Javascript
IE6 fixed的完美解决方案
2011/03/31 Javascript
js关闭当前页面(窗口)的几种方式总结
2013/03/05 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
2013/12/17 Javascript
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
2015/12/18 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
python读取Excel实例详解
2018/08/17 Python
python3使用pandas获取股票数据的方法
2018/12/22 Python
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
国际贸易专业个人求职信格式
2014/02/02 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
单位租房协议范本
2014/12/03 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
主持人大赛开场白
2015/05/29 职场文书