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 相关文章推荐
IStream与TStream之间的相互转换
Aug 01 PHP
php 生成静态页面的办法与实现代码详细版
Feb 15 PHP
用Php编写注册后Email激活验证的实例代码
Mar 11 PHP
PHP 观察者模式的实现代码
May 10 PHP
跟我学Laravel之配置Laravel
Oct 15 PHP
php实现mysql数据库连接操作及用户管理
Nov 08 PHP
php有效防止同一用户多次登录
Nov 19 PHP
非常重要的php正则表达式详解
Jan 04 PHP
WordPress后台中实现图片上传功能的实例讲解
Jan 11 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
Aug 21 PHP
浅谈PHP无限极分类原理
Mar 14 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采用curl实现伪造IP来源的方法
2014/11/21 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
PHP7 echo和print语句实例用法
2019/02/15 PHP
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
js查找某元素中的所有图片地址的方法
2014/01/16 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
three.js 入门案例详解
2018/01/23 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
pyspark操作MongoDB的方法步骤
2019/01/04 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
中医专业职业生涯规划书范文
2014/01/04 职场文书
正科级干部考察材料
2014/05/29 职场文书
邻里守望志愿服务活动方案
2014/08/15 职场文书
党员个人剖析材料
2014/09/30 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
学前教育见习总结
2015/06/23 职场文书
详解Go语言中Get/Post请求测试
2022/06/01 Golang
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS