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 相关文章推荐
PHP Ajax实现页面无刷新发表评论
Jan 02 PHP
php中的数组操作函数整理
Aug 18 PHP
数据库中排序的对比及使用条件详解
Feb 23 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
ThinkPHP开发框架函数详解:C方法
Aug 14 PHP
PHP使用PHPexcel导入导出数据的方法
Nov 14 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
Laravel中任务调度console使用方法小结
May 07 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 PHP
浅谈PHP中的Trait使用方法
Mar 22 PHP
解决php extension 加载顺序问题
Aug 16 PHP
PHP如何解决微信文章图片防盗链
Dec 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
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
解决CodeIgniter伪静态失效
2014/06/09 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
javascript json2 使用方法
2010/03/16 Javascript
javascript 传统事件模型构造的事件监听器实现代码
2010/05/31 Javascript
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
js数组的操作指南
2014/12/28 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
Python中特殊函数集锦
2015/07/27 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
python读取和保存视频文件
2018/04/16 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
Python有参函数使用代码实例
2020/01/06 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
澳大利亚宠物食品和用品商店:PETstock
2020/01/02 全球购物
酒店优秀员工事迹材料
2014/06/02 职场文书
应届大专生求职信
2014/06/26 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技