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实现文件安全下载
Oct 09 PHP
php笔记之:初探PHPcms模块开发介绍
Apr 26 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
Jun 24 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
PHP is_subclass_of函数的一个BUG和解决方法
Jun 01 PHP
使用array_map简单搞定PHP删除文件、删除目录
Oct 29 PHP
PHP的关于变量和日期处理的一些面试题目整理
Aug 10 PHP
thinkPHP3.2简单实现文件上传的方法
May 16 PHP
PHP isset()与empty()的使用区别详解
Feb 10 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
Aug 03 PHP
PHP实现的最大正向匹配算法示例
Dec 19 PHP
Codeigniter里的无刷新上传的实现代码
Apr 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实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
有关于PHP中常见数据类型的汇总分享
2014/01/06 PHP
php银联网页支付实现方法
2015/03/04 PHP
php微信支付之APP支付方法
2015/03/04 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
CI框架(CodeIgniter)操作redis的方法详解
2018/01/25 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
2020/05/02 PHP
JQuery 小练习(实例代码)
2009/08/07 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
Javascript 一些需要注意的细节(必看篇)
2017/07/08 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
javascript json对象小技巧之键名作为变量用法分析
2019/11/11 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
Python实例一个类背后发生了什么
2016/02/09 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
python实现斗地主分牌洗牌
2020/06/22 Python
降低python版本的操作方法
2020/09/11 Python
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
财务人员个人工作总结
2015/02/27 职场文书
运动会加油稿30字
2015/07/21 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
文书工作总结(范文)
2019/07/11 职场文书
MySQL 服务和数据库管理
2021/11/11 MySQL
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL