当前位置: 首页 > news >正文

PHP 使用GD库生成二维码 实现圆角

为什么80%的码农都做不了架构师?>>>   hot3.png

今天产品提出要实现二维码圆角功能 为配合功能实现 特此记录

1.使用laravel框架生成二维码 安装类库参见地址 http://laravelacademy.org/post/2605.html

QrCode::format('png')->size(520)->generate($url,$path);

2.需要把如下两张图片放在一起

输入图片说明

输入图片说明

/*
* ttf 是字体文件路径
* qrcodePath是二维码路径
* qrcodeComplePath 是合成后二维码的保存路径
*area_name和table_name 是项目在二维码空白处要写的内容  
*/
private function _mergeImage($ttf,$qrcodePath,$qrcodeCompletePath,$area_name,$table_name){
//        $area_name = "大厅";
//        $table_name = "200";
        $font_size = 28;
        $max_width = 827;

        $image = imagecreatefromPng('http://cpx-oss.oss-cn-beijing.aliyuncs.com/dish_img/1588/c8c71c7104184ff3f7c92555c4e218e5.png');
        $white=ImageColorAllocate($image, 255, 255, 255);
        $black=ImageColorAllocate($image, 0, 0, 0);
        $red=ImageColorAllocate($image, 255, 0, 0);
        $green=ImageColorAllocate($image, 0, 255, 0);
        $blue=ImageColorAllocate($image, 0, 0, 255);
        $head = ImageColorAllocate($image, 138, 138, 138);

        //二维码
        $src_im = imagecreatefrompng($qrcodePath);
        imagecopymerge($image,$src_im,190,85,30,30,430,430,100);


        //桌台信息
        $array = imagettfbbox($font_size, 0, $ttf, "{$area_name}:{$table_name}");
        $length = $array[4] - $array[6];
//        $string = "{$area_name}:{$table_name}";
        if($length > ($max_width-200)){
            $array = imagettfbbox($font_size, 0, $ttf, $area_name);
//            $area_height = $array[3] - $array[5];
            $area_width = $array[4] - $array[6];

            $array = imagettfbbox($font_size, 0, $ttf, $table_name);
//            $table_height = $array[3] - $array[5];
            $table_width = $array[4] - $array[6];

            $start1 = ceil(($max_width - $area_width) /2);
            $start2 = ceil(($max_width - $table_width) /2);

            imagettftext($image,$font_size,0,$start1,530,$black,$ttf,"{$area_name}");
            imagettftext($image,$font_size,0,$start2,630,$black,$ttf,"{$table_name}");
        }else{
            $start = ceil((($max_width - $length))/2);
            imagettftext($image,$font_size,0,$start,580,$black,$ttf,"{$area_name}:{$table_name}");
        }




        imagePng($image,$qrcodeCompletePath);
        imageDestroy($image);

        $image_r = $this->radius_img($qrcodeCompletePath, $radius = 45);
//        header("Content-type:image/png");
        imagePng($image_r,$qrcodeCompletePath);
//        imagePng($image_r);
        imageDestroy($image_r);
//        die;

    }

3.使用这种方式生成二维码时发布创建的背景的圆角没有了 如下图 输入图片说明 为了使用整张图片具有圆角效果 调用了自定义的radius_img函数 实现的圆角效果 圆角代码

public function radius_img($imgpath = './t.png', $radius = 15) {
        $ext     = pathinfo($imgpath);
        $src_img = null;
        switch ($ext['extension']) {
            case 'jpg':
                $src_img = imagecreatefromjpeg($imgpath);
                break;
            case 'png':
                $src_img = imagecreatefrompng($imgpath);
                break;
        }
        $wh = getimagesize($imgpath);
        $w  = $wh[0];
        $h  = $wh[1];
        // $radius = $radius == 0 ? (min($w, $h) / 2) : $radius;
        $img = imagecreatetruecolor($w, $h);
        //这一句一定要有
        imagesavealpha($img, true);
        //拾取一个完全透明的颜色,最后一个参数127为全透明
        $bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
        imagefill($img, 0, 0, $bg);
        $r = $radius; //圆 角半径
        for ($x = 0; $x < $w; $x++) {
            for ($y = 0; $y < $h; $y++) {
                $rgbColor = imagecolorat($src_img, $x, $y);
                if (($x >= $radius && $x <= ($w - $radius)) || ($y >= $radius && $y <= ($h - $radius))) {
                    //不在四角的范围内,直接画
                    imagesetpixel($img, $x, $y, $rgbColor);
                } else {
                    //在四角的范围内选择画
                    //上左
                    $y_x = $r; //圆心X坐标
                    $y_y = $r; //圆心Y坐标
                    if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
                        imagesetpixel($img, $x, $y, $rgbColor);
                    }
                    //上右
                    $y_x = $w - $r; //圆心X坐标
                    $y_y = $r; //圆心Y坐标
                    if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
                        imagesetpixel($img, $x, $y, $rgbColor);
                    }
                    //下左
                    $y_x = $r; //圆心X坐标
                    $y_y = $h - $r; //圆心Y坐标
                    if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
                        imagesetpixel($img, $x, $y, $rgbColor);
                    }
                    //下右
                    $y_x = $w - $r; //圆心X坐标
                    $y_y = $h - $r; //圆心Y坐标
                    if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
                        imagesetpixel($img, $x, $y, $rgbColor);
                    }
                }
            }
        }
        return $img;
    }

4.整体代码下来能实现所要的效果如下 输入图片说明

虽然实现的效果 但是实现过程很有优化的空间 今天先记录一下 后续优化完成补充

转载于:https://my.oschina.net/ives/blog/1815397

相关文章:

  • session一致性架构设计
  • 《shell编程实战》第4章shell变量进阶(上)
  • 批量实现多台服务器之间ssh无密码登录的相互信任关系
  • 与Bob McWhirter的问答:WildFly Swarm更名为Thorntail项目
  • AsyncTask实现原理
  • 最简单的无缝轮播
  • c中perror函数
  • 小身材超能量Oracle新一代数据库机帮助所有规模企业迈向云端
  • Confluence 6 注册单一小工具
  • Redis分布式锁的try-with-resources实现
  • shell脚本案例(五)利用nmap批量扫描存活主机
  • Echarts关于仪表盘
  • mysql 查询当天、本周,本月,上一个月的数据---https://www.cnblogs.com/benefitworld/p/5832897.html...
  • php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中)...
  • linux---文件颜色含义
  • JavaScript-如何实现克隆(clone)函数
  • [iOS]Core Data浅析一 -- 启用Core Data
  • ECMAScript6(0):ES6简明参考手册
  • es6要点
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript对象详解
  • Linux gpio口使用方法
  • PAT A1017 优先队列
  • PAT A1120
  • TypeScript迭代器
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Vue全家桶实现一个Web App
  • zookeeper系列(七)实战分布式命名服务
  • 给初学者:JavaScript 中数组操作注意点
  • 警报:线上事故之CountDownLatch的威力
  • 驱动程序原理
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 推荐一个React的管理后台框架
  • 怎样选择前端框架
  • ​插件化DPI在商用WIFI中的价值
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #define用法
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C语言)球球大作战
  • (k8s中)docker netty OOM问题记录
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (六)vue-router+UI组件库
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三) diretfbrc详解
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (四)Android布局类型(线性布局LinearLayout)
  • (算法二)滑动窗口
  • (一)SpringBoot3---尚硅谷总结