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 相关文章推荐
信用卡效验程序
Oct 09 PHP
PHP 替换模板变量实现步骤
Aug 24 PHP
PHP字符串处理的10个简单方法
Jun 30 PHP
php计算数组不为空元素个数的方法
Jan 27 PHP
php统计文章排行示例
Mar 04 PHP
php检测useragent版本示例
Mar 24 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
Nov 19 PHP
smarty简单入门实例
Nov 28 PHP
适合PHP初学者阅读的4本经典书籍
Sep 23 PHP
PHP请求远程地址设置超时时间的解决方法
Oct 29 PHP
详解将数据从Laravel传送到vue的四种方式
Oct 16 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
Mar 09 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
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
JavaScript通过select动态更换图片的方法
2015/03/23 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
2016/11/24 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
Node.Js生成比特币地址代码解析
2018/04/21 Javascript
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
vue把输入框的内容添加到页面的实例讲解
2019/11/11 Javascript
vue下canvas裁剪图片实例讲解
2020/04/16 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
python使用ctypes模块调用windowsapi获取系统版本示例
2014/04/17 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
python对常见数据类型的遍历解析
2019/08/27 Python
Python中断多重循环的思路总结
2019/10/04 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
介绍一下Java中的static关键字
2012/05/12 面试题
承办会议欢迎词
2014/01/17 职场文书
大学生学习2014全国两会心得体会
2014/03/13 职场文书
目标管理责任书
2014/04/15 职场文书
经典演讲稿开场白
2014/08/25 职场文书
中小学生学籍证明
2014/10/25 职场文书
2014年实习期工作总结
2014/11/27 职场文书
优秀班主任材料
2014/12/16 职场文书
诚信高考倡议书
2019/06/24 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
Linux中如何安装并部署Redis
2022/04/18 Servers