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 相关文章推荐
NT IIS下用ODBC连接数据库
Oct 09 PHP
PHP安全配置详细说明
Sep 26 PHP
那些年一起学习的PHP(三)
Mar 22 PHP
PHP输出XML到页面的3种方法详解
Jun 06 PHP
浅析php中如何在有限的内存中读取大文件
Jul 02 PHP
php截取html字符串及自动补全html标签的方法
Jan 15 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
Dec 14 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
php 如何禁用eval() 函数实例详解
Dec 01 PHP
php使用PDO执行SQL语句的方法分析
Feb 16 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
PHP实现的一致性Hash算法详解【分布式算法】
Mar 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
BBS(php & mysql)完整版(三)
2006/10/09 PHP
PHP 翻页 实例代码
2009/08/07 PHP
php字符串截取的简单方法
2013/07/04 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
用ADODB.Stream转换
2007/01/22 Javascript
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
Jquery Ajax请求代码(2)
2011/01/07 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
JavaScipt中栈的实现方法
2016/02/17 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
基于JavaScript实现简单的音频播放功能
2018/01/07 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
微信小程序实现限制用户转发功能的实例代码
2020/02/22 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
Python中url标签使用知识点总结
2020/01/16 Python
详解Pycharm出现out of memory的终极解决方法
2020/03/03 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
2013/01/09 HTML / CSS
应届生会计电算化求职信
2013/10/03 职场文书
《影子》教学反思
2014/02/21 职场文书
幼儿园辞职信
2015/05/13 职场文书
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android