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学习笔记 [预定义数组(超全局数组)]
Jun 09 PHP
PHP性能优化准备篇图解PEAR安装
Dec 05 PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 PHP
PHP生成条形图的方法
Dec 10 PHP
PHP基于单例模式实现的数据库操作基类
Jan 15 PHP
浅析PHP7新功能及语法变化总结
Jun 17 PHP
PHP仿微信多图片预览上传实例代码
Sep 13 PHP
如何判断php mysqli扩展类是否开启
Dec 24 PHP
PHP中常用的魔术方法
Apr 28 PHP
php语言注释,单行注释和多行注释
Jan 21 PHP
PHP使用递归按层级查找数据的方法
Nov 10 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 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 微信支付类 demo
2015/11/30 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
js select option对象小结
2013/12/20 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
js实现将选中内容分享到新浪或腾讯微博
2015/12/16 Javascript
理解JS绑定事件
2016/01/19 Javascript
购物车前端开发(jQuery和bootstrap3)
2016/08/27 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
React中的render何时执行过程
2018/04/13 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
Python中进程和线程的区别详解
2017/10/29 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
python异步Web框架sanic的实现
2020/04/27 Python
详解Python利用configparser对配置文件进行读写操作
2020/11/03 Python
Python 里最强的地图绘制神器
2021/03/01 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
同事吵架检讨书
2014/02/05 职场文书
医学生临床实习自我评价
2014/03/07 职场文书
2014年社区庆元旦活动方案
2014/03/08 职场文书
党的群众路线剖析材料
2014/10/09 职场文书
2015年七一建党节活动总结
2015/03/20 职场文书
2015年乡镇民政工作总结
2015/05/13 职场文书
导游词之河北野三坡
2019/12/11 职场文书
Android Studio 计算器开发
2022/05/20 Java/Android