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 相关文章推荐
实时抓取YAHOO股票报价的代码
Oct 09 PHP
PHP源码之explode使用说明
Aug 05 PHP
探讨各种PHP字符串函数的总结分析
Jun 05 PHP
对淘宝URL中ID提取的PHP代码
Sep 01 PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 PHP
修改ThinkPHP缓存为Memcache的方法
Jun 25 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
Jun 26 PHP
ThinkPHP模板IF标签用法详解
Jul 01 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
利用PHP扩展Xhprof分析项目性能实践教程
Sep 05 PHP
PHP时间类完整代码实例
Feb 26 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
PHP 飞信好友免费短信API接口开源版
2010/07/22 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
js window.event对象详尽解析
2009/02/17 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
2014/01/22 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
微信小程序“摇一摇”的实例代码
2017/07/20 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
Node.js使用supervisor进行开发中调试的方法
2019/03/26 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
django1.11.1 models 数据库同步方法
2018/05/30 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
Python后台开发Django的教程详解(启动)
2019/04/08 Python
pandas-resample按时间聚合实例
2019/12/27 Python
Django中的session用法详解
2020/03/09 Python
python matplotlib imshow热图坐标替换/映射实例
2020/03/14 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
材料采购员岗位职责
2013/12/17 职场文书
元旦晚会策划方案
2014/02/18 职场文书
协议书的格式
2014/04/23 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
安全生产标语口号
2015/12/26 职场文书
高中美术教学反思
2016/02/17 职场文书
信息技术课教学反思
2016/02/23 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android