/**
 * 图片合成工具类
 * 说明:
 * 拿过来不一定可以使用,需要自行调整每一步骤的参数,
 * 处理步骤分开,调整大小--改变圆角--合成图片--添加文字
 * 比较清晰,也可以封装到一个函数里面一步处理,可以自行补充
 * 注意:字体用的微软雅黑,自行下载引入
 * 图片测试调试阶段尽可能使用网络地址路径,
 * 没有自行创建目录函数,也没有清楚废弃的图片资源,自行完善

所有处理方式来自网络收集,一下整理
 */
namespace Demo\Controller;
class ImageGenerationController  {
   
    //控制输出
    public function demo()
    {
        //改变图像大小
        $stage1 = $this->resize_image('user.png','http://www./你的图片地址', 150, 150);
        if($stage1){
            //更改头像为圆形
            $stage2 = $this->yuanjiao($stage1,'./Uploads/card/thumb/'.$v['id'].'stage2.png');
            if(!empty($stage2)){
                //合成图片
                $stage3 = $this->getimg2($stage2);
                //添加文字
                if(!empty($stage3)){
                    //array('x'=>250,'y'=>110,'fontsize'=>20,'ttf'=>'./msyh.ttf')
                    //完成
                    $stage4 = $this->addText($stage3, array($list['name'],$list['lawfirm']),array('x'=>250,'y'=>110,'fontsize'=>20));
                }
            }
        }
    }
    /**
     * 给图片添加文字
     * @param string $strImg 图片文件名
     * @param string $strText 字符串内容
     * @param array $arrOpt ['r','g','b','x','y','fontsize','angle','savepath','ttf']
     */
    public function addText($retrue_id,$strImg, $strText, $arrOpt = array()){
        $intR = isset($arrOpt['r']) ? $arrOpt['r'] : 255;
        $intG = isset($arrOpt['g']) ? $arrOpt['g'] : 255;
        $intB = isset($arrOpt['b']) ? $arrOpt['b'] : 255;
        $intX = isset($arrOpt['x']) ? $arrOpt['x'] : 24;
        $intY = isset($arrOpt['y']) ? $arrOpt['y'] : 24;
        $intSize = isset($arrOpt['fontsize']) ? $arrOpt['fontsize'] : 14;
        $intAngle = isset($arrOpt['angle']) ? $arrOpt['angle'] : 0;
        $strSave = isset($arrOpt['savepath']) ? $arrOpt['savepath'] : false;
        $strFont = isset($arrOpt['ttf']) ? $arrOpt['ttf'] : './Public/qwadmin/css/msyh.ttf';
    
        $im = imagecreatefromstring(file_get_contents($strImg));
    
        $color = imagecolorallocate($im, $intR, $intG, $intB);
        //第一行 (标题)
//         imagettftext($im, $intSize, $intAngle, $intX, $intY, $color, $strFont, '|'.$strText);
//         imagettftext($im, $intSize, $intAngle, $intX+1, $intY, $color, $strFont, '|'.$strText);
        //第二行 (姓名)
        imagettftext($im, 16, $intAngle, 250, 165, $color, $strFont, $strText[0]);
        //第三行 (律所)
        imagettftext($im, 16, $intAngle, 250, 200, $color, $strFont, $strText[1]);
        //         if (empty($strSave)) {
        //             header("Content-type: image/jpeg");
        //             imagejpeg($im);
        //         } else {
        //imagejpeg($im, $strSave);
        
        imagepng($im,'./Uploads/card/thumb/stage4.png');
        //         }
        imagedestroy($im);
    }
    /**
     * 两张图合成一张
     * @param unknown $path_1 //默认背景图
     * @param unknown $path_2
     */
    private function getimg2($path_2){
        $path_1 ='https://xxx你的背景图url地址';//一般是固定,根据业务自行调整
        $image_1 = imagecreatefrompng($path_1);
        $image_2 = imagecreatefrompng($path_2);
        //创建一个和图1相同大小的真彩色画布(ps:只有这样才能保证后面copy图片的时候不会失真)
        $image_3 = imageCreatetruecolor(imagesx($image_1),imagesy($image_1));
        //为真彩色画布创建白色背景,再设置为透明
        $color = imagecolorallocate($image_3, 1000, 1000, 1000);
        //此处3个1000可以使背景设为白色,3个255可以使背景变成透明色
        imagefill($image_3, 0, 0, $color);
        imageColorTransparent($image_3, $color);
        //首先将图1画布采样copy到真彩色画布中,不会失真
        imagecopyresampled($image_3,$image_1,0,0,0,0,imagesx($image_1),imagesy($image_1),imagesx($image_1),imagesy($image_1));
        //再将图2图片copy到已经具有图1图像的真彩色画布中,同样也不会失真
        //imagecopymerge($image_3,$image_2, 0,0,0,0,imagesx($image_2),imagesy($image_2), 100);
        return  $this->imagecopymerge_alpha($image_3,$image_2,50,70,0,0,imagesx($image_2),imagesy($image_2), 0);
    }
    /**
     * 去除png  白色描边的位置
     * @param unknown $retrue_id
     * @param unknown $dst_im
     * @param unknown $src_im
     * @param unknown $dst_x
     * @param unknown $dst_y
     * @param unknown $src_x
     * @param unknown $src_y
     * @param unknown $src_w
     * @param unknown $src_h
     * @param unknown $pct
     * @return string
     */
    private function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){
        $opacity=$pct;
        $w = imagesx($src_im);
        $h = imagesy($src_im);
        $cut = imagecreatetruecolor($src_w, $src_h);
        imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h);
        $opacity = 100-$opacity;
        imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h);
        imagecopymerge($dst_im, $cut, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $opacity);
        
        $imgpath = './Uploads/card/thumb/stage3.png';
        imagepng($dst_im,$imgpath);
        return $imgpath;
    }
    /**
     * 设置正方形头像为圆形
     * @param unknown $img  图像路径
     * @param unknown $dest_path  存储路径
     * @return unknown
     * 出入来之,博客
     */
    public function yuanjiao($img,$dest_path){
        $src = imagecreatefromstring(file_get_contents($img)); //获取网络资源文件
        $wh= getimagesize($img);
        $w=$wh[0];
        $h=$wh[1];
        $w=min($w,$h);
        $h= $w;
        $newpic = imagecreatetruecolor($w,$h);
        //建立的是一幅大小为 x和 y的黑色图像(默认为黑色),如想改变背景颜色则需要用填充颜色函数imagefill($img,0,0,$color);
        // $img = imagecreatetruecolor(100,100);    //创建真彩图像资源
        // $color = imagecolorAllocate($img,200,200,200);   //分配一个灰色
        // imagefill($img,0,0,$color);
        // 启用混色模式
        imagealphablending($newpic,false); //设定图像的混色模式
        //imagealphablending() 允许在真彩色图像上使用两种不同的绘画模式。
        // 在混色(blending)模式下,alpha 通道色彩成分提供给所有的绘画函数,例如 imagesetpixel() 决定底层的颜色应在何种程度上被允许照射透过。作为结果,GD 自动将该点现有的颜色和画笔颜色混合,并将结果储存在图像中。结果的像素是不透明的。
        // 在非混色模式下,画笔颜色连同其 alpha 通道信息一起被拷贝,替换掉目标像素。混色模式在画调色板图像时不可用。
        // 如果 blendmode 为 TRUE,则启用混色模式,否则关闭。成功时返回 TRUE, 或者在失败时返回 FALSE。
        $transparent = imagecolorallocatealpha($newpic, 255, 255, 255, 127);//边缘透明
        //imagecolorallocatealpha(resource $image , int $red , int $green , int $blue, int $alpha )
        // $image 图像资源,通过创造的图像功能,如,一返回imagecreatetruecolor()。
        // $red 红色分量的价值。
        // $green 价值的绿色成分。
        // $blue 蓝色成分的价值。
        // $alpha 一个介于0和127的价值。 0表示完全不透明,而127表示完全透明。
        $r=$w/2;
        for($x=0;$x<$w;$x++){
            for($y=0;$y<$h;$y++){
                $c = imagecolorat($src,$x,$y);
                $_x = $x - $w/2;
                $_y = $y - $h/2;
                if((($_x*$_x) + ($_y*$_y)) < ($r*$r)){
                    imagesetpixel($newpic,$x,$y,$c);
                }else{
                    imagesetpixel($newpic,$x,$y,$transparent);
                    //imagesetpixel() 在 image 图像中用 color 颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。
                }
            }
        }
        //imagesavealpha() 设置标记以在保存 PNG 图像时保存完整的 alpha 通道信息(与单一透明色相反)
        imagesavealpha($newpic, true);
        // header('Content-Type: image/png');
        $imgcc = imagepng($newpic, $dest_path);
        imagedestroy($newpic);
        imagedestroy($src);
        return $dest_path;
            
    }
    /**
     * 改变图片尺寸大小
     * @param unknown $filename 文件名字
     * @param unknown $tmpname  当前文件路径
     * @param unknown $xmax     最大宽度
     * @param unknown $ymax     最大高度
     * @return unknown
     */
    private function  resize_image($filename, $tmpname, $xmax, $ymax)
    {
        $ext = explode(".", $filename);
        $ext = $ext[count($ext)-1];
        $im = false;
        if($ext == "jpg" || $ext == "jpeg"){
            $im = imagecreatefromjpeg($tmpname);
            if($im == false){
                //防止命名后缀错误,与实际图片的格式不一致
                $im = imagecreatefrompng($tmpname);
            }
        }else if($ext == "png"){
            $im = imagecreatefrompng($tmpname);
            if($im == false){
                //防止命名后缀错误,与实际图片的格式不一致
                $im = imagecreatefromjpeg($tmpname);
            }
        }else if($ext == "gif"){
            $im = imagecreatefromgif($tmpname);
        }
        $x = imagesx($im);
        $y = imagesy($im);
        if($x <= $xmax && $y <= $ymax){
            return $im;
        }    
        //处理........
        if($x >= $y) {
            $newx = $xmax;
            $newy = $newx * $y / $x;
        }
        else {
            $newy = $ymax;
            $newx = $x / $y * $newy;
        }
        $im2 = imagecreatetruecolor($newx, $newy);
        imagecopyresized($im2, $im, 0, 0, 0, 0, floor($newx), floor($newy), $x, $y);
        //返回当前名字
        $cc = imagepng($im2,'./Uploads/card/thumb/'.$filename);
        imagedestroy($im2);
        return './Uploads/card/thumb/'.$filename;
    }
    
}

php|thinkphp程序合成图片+文字+图片大小调整+正方形转换圆角+去除白色边框相关推荐

  1. 微信小程序 canvas描绘文字图片 生成图片并保存到本地

    在实现这个功能时,遇到以下的问题: 1. canvas绘制文字的换行问题: 如果文字的长度大于你所定的宽度的话,文字会超出你所定宽度: 小程序的CanvasContext.fillText有一个max ...

  2. C#-调用OCR组件识别图片文字

    C#调用OCR组件识别图片文字 图片识别的技术到几天已经很成熟了,只是相关的资料很少,为了方便在此汇总一下(C#实现),方便需要的朋友查阅,也给自己做个记号. 图片识别的用途:很多人用它去破解网站的验 ...

  3. ios 改变图片尺寸_iOS基础(十八)——调整图片尺寸和大小

    调整图片尺寸和大小 /** * 调整图片尺寸和大小 * * @param sourceImage 原始图片 * @param maxImageSize 新图片最大尺寸 * @param maxSize ...

  4. 用图片文字识别软件 复制微信小助手的开票信息

    微信目前有开票小助手的功能,可以保存开票信息,客户经常会发微信开票小助手里的截图,附带有个二维码,这边可以扫描二维码获取抬头,虽然听说有用二维码极速开票的,对于这个不清楚,也不打算了解,本人还是用的传 ...

  5. canvas图片文字合成(小程序分享)

    写这个的原因是在写一个小程序的需求的时候用到了,在此记录一下. 需求需要实现的点就是:在分享小程序个人资料页面的时候将个人信息和个人头像进行重叠放在一起然后分享出去,大概样子如下: 不同的用户头像不同 ...

  6. C# 后台 背景图片拼接图片与文字,文字图片生成与背景图片合成

    标题C# 后台 背景图片拼接图片与文字,文字图片生成与背景图片合成 最近有个需求是将生成的邀请码与背景图片合成成为新的图片,查找了一些资料后又整理了一遍,查到了一个群主的帖子,虽然代码略微有点问题,地 ...

  7. php 图片合成,php原生图片合成和文字生成图片

    之前有一个我写的帖子是可以拿到远程地址的图片保存本地的 前段时间搞的很火的朋友圈标签,可以使用下面仅仅三个自定义函数即可合成,具体参数石头已经给大家写出,有需要改进的地方请直接留言! /** * a. ...

  8. CxImage透明图片合成和文字叠加

    1         CxImage的作用 CxImage将几张图片合成一张图片,在一张底图上添加图片,有些图片是有透明效果的,实现图片之间的透明重叠效果.另外还可以添加文字. (1)背景图片mymix ...

  9. jsjq来封装一个图片文字合成图案的方法

    记录一下:封装一个图片文字合成图案的方法 这里首先做个说明 项目里使用到用canvas生成海报,在toDataURL报了这个错误Tainted canvases may not be exported ...

最新文章

  1. leetcode算法题--字符串相乘
  2. jdbc mysql参数_Mysql JDBC URL中的重要参数有啊些
  3. python基础学习笔记——方法返回值
  4. iOS程序员也要学点算法吧 简单排序之插入排序
  5. 用python生成云词汇_用python生成词云wordcloud
  6. 环境搭建创建一个javaweb+maven+Jfinal项目
  7. nginx 开机启动_4步配置Nginx + Keepalived + Havip,解决前端单点问题
  8. Win10纯净版和官方原版哪个好?
  9. c语言ad转换实验报告,苏州大学实验报告-实验四ad转换模块实验报告
  10. mitmproxy监听数据请求并处理数据
  11. Python批量提取Excel文件中所有单元格批注
  12. 2019-2020年数学建模竞赛心得体会
  13. Mybatis注解开发指北
  14. 【背包DP】【2018.9.20普及组模拟】T3(WOJ 3975)保护羊村
  15. 贪心问题(Python代码实现)——磁带最优存储问题
  16. 关闭localized intellij idea切换语言提醒
  17. android OTG (USB读写,U盘读写)最全使用相关总结
  18. ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析...
  19. 《对不队》团队项目软件系统设计改进
  20. LT8912B产品概述

热门文章

  1. Linux如何ping本机IP,Linux ping6 本地ipv6地址无效的参数
  2. 智能手表的下半场,机遇与挑战并存
  3. 固定资产自动盘点系统,盘点固定资产及利润更清晰
  4. TCP/IP协议栈Lwip的设计与实现:之三
  5. 【BLE】TLSR8258开发记录之7--SPI驱动W25Q16U
  6. Ext3、Ext4、FAT、FAT32、NTFS、exFAT、Sparse、Raw
  7. Linux下GPT分区,gdisk修复损坏的分区表
  8. 【分享】参加一个0元小白理财训练营开营第1天的学习笔记
  9. 100天精通Python(基础篇)——第19天:练习题:我要买票吗
  10. 【洛谷】P1598 垂直柱状图