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 相关文章推荐
使用JSON实现数据的跨域传输的php代码
Dec 20 PHP
php抓取页面的几种方法详解
Jun 17 PHP
php object转数组示例
Jan 15 PHP
php版淘宝网查询商品接口代码示例
Jun 17 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
Jul 15 PHP
PHP+MYSQL会员系统的开发实例教程
Aug 23 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
Mar 27 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
Apr 20 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
Feb 14 PHP
PHP中set_include_path()函数相关用法分析
Jul 18 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
Nov 04 PHP
thinkPHP框架中执行事务的方法示例
May 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 正则表达式小结
2015/02/12 PHP
php实现用已经过去多长时间的方式显示时间
2015/06/05 PHP
php多线程并发实现方法
2016/09/30 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
读jQuery之十 事件模块概述
2011/06/27 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
详解vue父子组件间传值(props)
2017/06/29 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
Vue表情输入组件 微信face表情组件
2019/02/11 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
2019/05/14 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
python实现年会抽奖程序
2019/01/22 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
基于Python爬虫采集天气网实时信息
2020/06/05 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
Django视图、传参和forms验证操作
2020/07/15 Python
学校消防演习方案
2014/02/19 职场文书
化学专业自荐信
2014/05/28 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
2014年民警工作总结
2014/11/25 职场文书
新年祝酒词大全
2015/08/11 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
Python 中的 copy()和deepcopy()
2021/11/07 Python
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技