精华内容
下载资源
问答
  • 使用python,使用pillow库、qrcode库自动处理图片并添加二维码处理的小思路,并加入进度条可视化
  • 利用微信强大的社交能力通过小程序达到裂变的目的,拉取新用户。下面小编给大家带来了微信小程序生成海报分享朋友圈的实现方法,感兴趣的朋友跟随小编一起看看吧
  • 微信小程序生成海报

    2018-04-28 11:56:07
    用于微信小程序生成海报,可调节图片大小,内容自定义,位置等属性,打开即用
  • uniapp 生成海报图片base64转换 (微信头像贴在海报上需要base64转换)import { pathToBase64, base64ToPath } from "路径" base64ToPath(res.data.data.poster) .then(path => {}) .catch(error => { ...
  • uni-app微信小程序生成海报
  • 主要介绍了小程序如何在不同设备上自适应生成海报的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 该demo主要用于微信小程序生成海报功能,简单快捷,容易维护等
  • 功能全,支持文本、图片、矩形、qrcode 类型的 view 绘制 支持文字背景、获取宽度、主动换行 布局全,支持多种布局方式,如 align(对齐方式)、rotate(旋转) 支持圆角,其中图片,矩形,和整个画布支持 ...
  • poster 是后端生成海报图片的一种简单方式,其适用于微信小程序海报分享,保存到相册后可以分享到朋友圈。
  • H5代码生成海报图并下载,澎湃新闻APP生成海报
  • 原生小程序js生成海报-Painter插件
  • 通过canvas绘制的海报,获取用户授权的处理,对拒绝授权的处理,然后保存到相册
  • 微信小程序demo示例,根据内容生成海报图片,一共有10个源码示例。
  • 小程序海报生成工具,可视化编辑直接生成代码 体验地址 请点击这个链接体验 生成painter代码,充分利用painter的优势 小程序生成图片库,轻松通过 json 方式绘制一张可以发到朋友圈的图片 使用 git clone ...
  • 主要介绍了JavaScript基于用户照片姓名生成海报,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了python使用PIL给图片添加文字生成海报示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 微信小程序海报插件,生成海报的小程序组件wxa-plugin-canvas-master.zip
  • 可参照链接:https://blog.csdn.net/qq7796336/article/details/103716500 可参照链接:https://blog.csdn.net/qq_38377774/article/details/108767573 可参照链接:https://www.cnblogs.com/loytime/p/9959428.html
  • springboot生成宣传海报

    2020-07-14 16:46:34
    java生成宣传海报,文章地址:https://blog.csdn.net/weixin_39984161/article/details/107341471
  • 1.h5生成海报 <div id="qrcodeCanvas" style="position: absolute;left:-2000px"></div> <!--海报图画布--> <canvas id="myCanvas" style="position: absolute;right:-2000px"></...

    1.h5生成海报

     <div id="qrcodeCanvas" style="position: absolute;left:-2000px"></div>
        <!--海报图画布-->
        <canvas id="myCanvas" style="position: absolute;right:-2000px"></canvas>
         <div class="showPoster"><img id="showImg" />
     <div>
    <script type="text/javascript" src="./js/jquery.js"></script>
    <script src="./js/showLoading/showLoading/jquery.showLoading.min.js"></script>
    <script src="./js/showLoading/showLoading/jquery.showLoading.js"></script>
    <script type="text/javascript" src="./js/qrcode.js"></script>
    <script type="text/javascript">
        var qrcodeImg    //二维码img
        shareImg();
        function shareImg(){
            $('#showImg').showLoading('图片生成中...');
            //移除已生成的避免重复(必须!)
            $('#qrcodeCanvas').html("");
            var qrcode = new QRCode('qrcodeCanvas', {
                text: "二维码内容",
                width: 100,
                height: 100,
                colorDark: '#000000',
                colorLight: '#ffffff',
                correctLevel: QRCode.CorrectLevel.H
            });
            qrcodeImg = $("#qrcodeCanvas img")[0]
            qrcodeImg.crossOrigin = "anonymous"
            console.log(qrcodeImg)
            //这里必须用onload 二维码是异步生成,异步的意思不用多说吧?
            qrcodeImg.onload = function() {
                //画海报
                beginDraw()
            }
        }
        function beginDraw(){
            //画海报
            var width  = 320
            var height = 450
            var c      = document.getElementById("myCanvas");
            c.width    = width
            c.height   = height
            var ctx    = c.getContext("2d");
            //首先画上背景图
            //注意:H5中任何图片写入画布都是以img 例如(<img src="123.png">),以下代码console.log() 出来就是它
            var img = new Image();
            img.src = '图片地址';
            img.crossOrigin = "anonymous"
            img.onload = function() {
                //画入背景图
                ctx.drawImage(img,0,0,width,height);
                img.src = '图片地址';
                img.crossOrigin = "anonymous"
                img.onload = function() {
                    //画入logo
                    ctx.drawImage(img,90,30,150,140);
                    img.src = '图片地址';
                    img.crossOrigin = "anonymous"
                    img.onload = function() {
                        //画入底部背景
                        ctx.drawImage(img,0,height-180,width,120);
                        img.src = '图片地址';
                        img.crossOrigin = "anonymous"
                        img.onload = function() {
                            //画入头像
                            ctx.drawImage(img,10,height-155,70,70);
                            //画入二维码
                            ctx.drawImage(qrcodeImg,210,height-170,100,100);
                            ctx.font ="18px Bold Arial";
                            ctx.fillStyle = "#fff";
                            ctx.fillText("文字",40,height-220);
                            ctx.font ="18px Medium Arial";
                            ctx.fillStyle = "#000";
                            ctx.fillText("文字",90,height-130);
                            ctx.font ="18px Medium Arial";
                            ctx.fillStyle = "#000";
                            ctx.fillText("文字 ",90,height-90);
                            //绘制完成,转为图片
                            setTimeout(function() {
                                base64_path = c.toDataURL("image/jpeg",1);
                                $('#showImg').attr('src',base64_path)
                                $('#showImg').hideLoading();
                                $('.mask').show()
                                $('.showPoster').show()
                            },100)
    
                        }
                    }
                }
            }
        }
    </script>

    2.本以为大功告成 结果部分安卓手机在这里不执行

            qrcodeImg.onload = function() {
                //画海报
                beginDraw()
            } 

    搜了一大顿资料,参考移动端File和Base64的坑  可能会解决吧

    我就不试了

    3.直接后台生成吧

            $new_file_name = $fiel_dir .$file_name;
            $fontpath = realpath('./ttf/simsunb.ttf');
    //        $fontpath = 'https://cummins.weimobile.cc/ttf/arial.ttf';
            $config = array(
                'text'=>array(
                    array(
                        'text'=>'文字',
                        'left'=>23,
                        'top'=>330,
                        'fontPath'=>$fontpath,     //字体文件
                        'fontSize'=>22,             //字号
                        'fontColor'=>'255,255,255',       //字体颜色
                        'angle'=>0,
                    ),
    
                ),
                'image'=>array(
                    array(
                        'url'=> '图片地址',//kmslogo
                        'left'=>120,
                        'top'=>60,
                        'stream'=>0,             //图片资源是否是字符串图像流
                        'right'=>0,
                        'bottom'=>0,
                        'width'=>150,
                        'height'=>150,
                        'opacity'=>100
                    ),
                    
                ),
                'background'=>'背景图路径',
            );
            $filename=createPoster($config,$new_file_name);
    /**
     * 生成宣传海报
     * @param array  参数,包括图片和文字
     * @param string  $filename 生成海报文件名,不传此参数则不生成文件,直接输出图片
     * @return [type] [description]
     */
    function createPoster($config=array(),$filename=""){
        //如果要看报什么错,可以先注释调这个header
        if(empty($filename))
            header("content-type: image/png");
        $imageDefault = array(
            'left'=>0,
            'top'=>0,
            'right'=>0,
            'bottom'=>0,
            'width'=>100,
            'height'=>100,
            'opacity'=>100
        );
        $textDefault = array(
            'text'=>'',
            'left'=>0,
            'top'=>0,
            'fontSize'=>32,       //字号
            'fontColor'=>'255,255,255', //字体颜色
            'angle'=>0,
        );
        $background = $config['background'];//海报最底层得背景
        //背景方法
        $backgroundInfo = getimagesize($background);
        $backgroundFun = 'imagecreatefrom'.image_type_to_extension($backgroundInfo[2], false);
        $background = $backgroundFun($background);
        $backgroundWidth = imagesx($background);  //背景宽度
        $backgroundHeight = imagesy($background);  //背景高度
        $imageRes = imageCreatetruecolor($backgroundWidth,$backgroundHeight);
        $color = imagecolorallocate($imageRes, 0, 0, 0);
        imagefill($imageRes, 0, 0, $color);
        // imageColorTransparent($imageRes, $color);  //颜色透明
        imagecopyresampled($imageRes,$background,0,0,0,0,imagesx($background),imagesy($background),imagesx($background),imagesy($background));
        //处理了图片
        if(!empty($config['image'])){
            foreach ($config['image'] as $key => $val) {
                $val = array_merge($imageDefault,$val);
                $info = getimagesize($val['url']);
                $function = 'imagecreatefrom'.image_type_to_extension($info[2], false);
                if($val['stream']){   //如果传的是字符串图像流
                    $info = getimagesizefromstring($val['url']);
                    $function = 'imagecreatefromstring';
                }
                $res = $function($val['url']);
                $resWidth = $info[0];
                $resHeight = $info[1];
                //建立画板 ,缩放图片至指定尺寸
                $canvas=imagecreatetruecolor($val['width'], $val['height']);
                imagefill($canvas, 0, 0, $color);
                //关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
                imagecopyresampled($canvas, $res, 0, 0, 0, 0, $val['width'], $val['height'],$resWidth,$resHeight);
                $val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']) - $val['width']:$val['left'];
                $val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']) - $val['height']:$val['top'];
                //放置图像
                imagecopymerge($imageRes,$canvas, $val['left'],$val['top'],$val['right'],$val['bottom'],$val['width'],$val['height'],$val['opacity']);//左,上,右,下,宽度,高度,透明度
            }
        }
        //处理文字
        if(!empty($config['text'])){
            foreach ($config['text'] as $key => $val) {
                $val = array_merge($textDefault,$val);
                list($R,$G,$B) = explode(',', $val['fontColor']);
                $fontColor = imagecolorallocate($imageRes, $R, $G, $B);
                $val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']):$val['left'];
                $val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']):$val['top'];
    //            imagettftext($imageRes,$val['fontSize'],$val['angle'],$val['left'],$val['top'],$fontColor,'STHUPO.TTF',$val['text']);
                imagettftext($imageRes,$val['fontSize'],$val['angle'],$val['left'],$val['top'],$fontColor,$val['fontPath'],$val['text']);
            }
        }
        //生成图片
        if(!empty($filename)){
            $res = imagejpeg ($imageRes,$filename,90); //保存到本地
            imagedestroy($imageRes);
            if(!$res) return false;
            return $filename;
        }else{
            imagejpeg ($imageRes);     //在浏览器上显示
            imagedestroy($imageRes);
        }
    }

     4.关于字体大小  摘自https://zhidao.baidu.com/question/507382898.html

    共有8个参数,缺一不可:
      (1)$image 这个是画布资源,无需再解释;
      (2)$size,官方文档的解释是,字体大小,其长度单位依赖于GD库的版本,对于GD1来说是像素,对于GD2来说是磅(point)。现在一般都是GD2了,那么这个磅究竟是什么意思呢?这涉及到字体设计的基本知识。
      操作位图时,以像素位单位最精确合理,那么使用GD2库的时候,如何绘制大小为20像素的字呢?也就是多少磅才能等于20个像素呢?这必须通过分辨率才能计算出来,而问题是位图本身并没有分辨率的概念。
      现在把问题返回来,如果给定$size=20磅,那么imageTtfText()绘制完成时,究竟会占用多少像素。无论如何,imageTtfText()最终还是要把文字绘制落实到具体的位图像素上。
      这个问题确实非常棘手,此函数内部必然会使用某个分辨率PPI来计算被渲染的像素区域。而GD2库却没有提供任何让用户设置或者读取这个分辨率的方法。那么,我们只能动手测试了。使用不同的磅值绘制文字,然后测量文字占据的像素,通过公式:
      PPI = (72*像素数)/磅值。实验得出的结论是:
      [plain] view plaincopyprint?
      1磅==>4像素, PPI=288
      2磅==>5像素, PPI=180
      3磅==>7像素, PPI=168
      4磅==>8像素, PPI=144
      5磅==>9像素, PPI=129.6
      6磅==>10像素, PPI=120
      7磅==>11像素, PPI=113.14285714286
      8磅==>12像素, PPI=108
      9磅==>14像素, PPI=112
      10磅==>15像素, PPI=108
      11磅==>16像素, PPI=104.72727272727
      12磅==>17像素, PPI=102
      13磅==>18像素, PPI=99.692307692308
      14磅==>19像素, PPI=97.714285714286
      15磅==>21像素, PPI=100.8
      16磅==>22像素, PPI=99
      17磅==>23像素, PPI=97.411764705882
      18磅==>25像素, PPI=100
      19磅==>26像素, PPI=98.526315789474
      20磅==>27像素, PPI=97.2
      21磅==>28像素, PPI=96
      22磅==>29像素, PPI=94.909090909091
      23磅==>30像素, PPI=93.913043478261
      24磅==>32像素, PPI=96
      25磅==>33像素, PPI=95.04
      26磅==>34像素, PPI=94.153846153846
      27磅==>35像素, PPI=93.333333333333
      28磅==>36像素, PPI=92.571428571429
      29磅==>38像素, PPI=94.344827586207
      30磅==>39像素, PPI=93.6
      31磅==>40像素, PPI=92.903225806452
      32磅==>41像素, PPI=92.25
      33磅==>43像素, PPI=93.818181818182
      34磅==>44像素, PPI=93.176470588235
      35磅==>46像素, PPI=94.628571428571
      36磅==>47像素, PPI=94
      37磅==>48像素, PPI=93.405405405405
      38磅==>48像素, PPI=90.947368421053
      39磅==>50像素, PPI=92.307692307692
      40磅==>51像素, PPI=91.8
      41磅==>52像素, PPI=91.317073170732
      42磅==>53像素, PPI=90.857142857143
      43磅==>55像素, PPI=92.093023255814
      44磅==>56像素, PPI=91.636363636364
      45磅==>57像素, PPI=91.2
      46磅==>58像素, PPI=90.782608695652
      47磅==>60像素, PPI=91.914893617021
      48磅==>62像素, PPI=93
      49磅==>63像素, PPI=92.571428571429
      50磅==>63像素, PPI=90.72
      51磅==>64像素, PPI=90.352941176471
      52磅==>67像素, PPI=92.769230769231
      53磅==>68像素, PPI=92.377358490566
      54磅==>69像素, PPI=92
      55磅==>70像素, PPI=91.636363636364
      56磅==>71像素, PPI=91.285714285714
      57磅==>72像素, PPI=90.947368421053
      58磅==>74像素, PPI=91.862068965517
      59磅==>75像素, PPI=91.525423728814
      60磅==>76像素, PPI=91.2
      61磅==>77像素, PPI=90.885245901639
      62磅==>78像素, PPI=90.58064516129
      63磅==>79像素, PPI=90.285714285714
      64磅==>81像素, PPI=91.125
      65磅==>83像素, PPI=91.938461538462
      66磅==>84像素, PPI=91.636363636364
      67磅==>85像素, PPI=91.34328358209
      68磅==>86像素, PPI=91.058823529412
      69磅==>86像素, PPI=89.739130434783
      70磅==>88像素, PPI=90.514285714286
      71磅==>90像素, PPI=91.267605633803
      72磅==>91像素, PPI=91
      73磅==>92像素, PPI=90.739726027397
      74磅==>93像素, PPI=90.486486486486

    可见当大于46磅时,PPI稳定在90,而小于46磅时,PPI一直在微变。
      所以,如果你想绘制20个像素大小的字体,那么必须设置$size参数为:14.5磅。
      另外需要注意的是,$size并不完全对应字体的显示大小,因为同样的$size,不同的字符占据的空间并不是一样的。例如,汉字“国”的宽度会比数字1的宽度大得多,对于标点符号,则更是这样,半角和全角符号也不同。
      总之,使用imageTtfText()不可能精确控制到像素级别,只能大概。这也算是矢量字体的一个小缺陷。

    (4)(5)$x,$y 被绘制字符串的第一个字符的基线点。单位是像素。这里涉及到字体设计的基本知识--基线。这个点绝对不是左上角,(这里要注意)而具体是什么取决于所使用的字体是如何设计的。对于宋体、楷体、黑体等常见的字体中的汉字,这个点大概位于字体的左下部分;而对于英文字母和标点符号,则各不相同。

    5.以为可以成功了,

    字体文件是windows下的font文件下复制的,结果字体不识别,一顿正方形是啥意思。。。码云上搜的成功案例的字体文件使用,嗯 这下可以了

    目录

    1.h5生成海报

    2.本以为大功告成 结果部分安卓手机在这里不执行

    3.直接后台生成

     4.关于字体大小  摘自https://zhidao.baidu.com/question/507382898.html

    5.以为可以成功了,

     

     

    展开全文
  • 昨天写了一篇小程序本地生成二维码的功能小程序本地生成二维码,趁热打铁今天给大家分享一下小程序内生成海报的功能以及具体步骤 这次分享海报里面的元素比较少,进行绘制的分别有头像,海报背景以及二维码(二维码...
  • vue生成海报

    2021-12-28 16:30:43
    需求: 点击生成分享海报 方法一:vue-canvas-poster npm install vue-canvas-poster --save // 在main.js中引入 import VueCanvasPoster from ‘vue-canvas-poster’; Vue.use(VueCanvasPoster); vue页面中使用...

    需求: 点击生成分享海报

    方法一:vue-canvas-poster

    npm install vue-canvas-poster --save

    // 在main.js中引入
    import VueCanvasPoster from ‘vue-canvas-poster’;
    Vue.use(VueCanvasPoster);

    vue页面中使用

    <template>
        <div>
            <button @click="toCreatePoster">点击生成海报</button>
            <vue-canvas-poster :widthPixels="750" :painting="painting" @success="canvasSuccess" @fail="canvasFail"></vue-canvas-poster>
            <div class="poster-container" v-if="posterImg">
                <img style="width: 100%;height: 100%;" :src="posterImg" alt="">
            </div>
        </div>
    </template>
    <script>
    export default {
        data() {
            return {
                posterImg: '',//生成的海报图片路径
                painting: {},
                imgUrl1: 'https://image-c.weimobwmc.com/saas-wxbiz/abf8277ee1a040e29d540b84504cf5a1.jpg',
                imgUrl2: 'https://ddcz.oss-cn-beijing.aliyuncs.com/images/file-1587004539522R5oa.png',
                qrCodeUrl: 'http://www.baidu.com'
            }
        },
        mounted() {
            this.toImages(this.imgUrl1);
        },
        methods: {
            toCreatePoster() {
                this.toImages(this.imgUrl2);
            },
            // 点击生成海报
            toImages(imgUrl) {
                this.painting = {
                width: '750px',
                height: '1334px',
                background: '#eba6a6',
                views: [{
                    type: 'image',
                    url: imgUrl,
                    css: {
                        top: '20px',
                        left: '36px',
                        borderRadius: '40px',
                        width: '80px',
                        height: '80px',
                    },
                }, {  
                    type: 'text',
                    text: '张三',
                    css: {
                        top: '48px',
                        left: '160px',
                        width: '360px',
                        maxLines: 1,
                        fontSize: '26px',
                    },
                }, {
                    type: 'text',
                    text: '搜索',
                    css: {
                        top: '600px',
                        left: '326px',
                        maxLines: 1,
                        fontSize: '60px',
                        color: '#fff'
                    },
                }, {
                    type: 'qrcode',
                    content: this.qrCodeUrl,
                    css: {
                        bottom: '120px',
                        right: '40px',
                        color: '#000',
                        background: '#fff',
                        width: '130px',
                        height: '130px',
                        borderWidth: '10px',
                        borderColor: '#fff'
                    },
                }, {
                    type: 'text',
                    text: '扫一扫二维码',
                    css: {
                        bottom: '48px',
                        right: '26px',
                        // width: '360px',
                        maxLines: 1,
                        fontSize: '26px',
                    },
                }],
                }
            },
            /**
             * 成功生成海报
             */
            canvasSuccess(src) {
                this.posterImg = src; //生成是base64格式的图片
                console.log(src)
            },
        
            /**
             * 无法生成海报
             */
            canvasFail(err) {
                alert(err)
            }
        }
    }
    </script>
    <style lang="scss" scoped>
    // 海报
    .poster-container {
        position: absolute;
        top: 20px;
        left: 0;
    }
    </style>
    

    最终效果如下:
    在这里插入图片描述

    展开全文
  • java封装的海报生成

    2020-09-25 17:07:52
    利用java Graphics2D 绘制图片,最终生成自定义的海报图片。一个文件,java生成海报类,希望对同行有所帮助,亲测有效
  • TP5生成海报源码

    千次阅读 2019-10-30 12:07:47
    PHP生成海报 php生成海报,包括背景图片和小程序二维码、文字、用户头像等相互合并。 php代码示例: //海报生成 public function poster($adminList){ $adminList=json_decode($adminList,true); ...

                 PHP生成海报

    php生成海报,包括背景图片和小程序二维码、文字、用户头像等相互合并。

    php代码示例:

    //海报生成
       public function poster($adminList){
          $adminList=json_decode($adminList,true);
            $data=[
              'adminId'=>$adminList['id'],
              'type'=>'adminIdPoster',
            ];
            //获取二维码
           $qrcode=action('home/Qrcode/getQRcode',json_encode($data));
          if(!$qrcode){
             return 0;
          }
          //二维码和背景图片生成(图一)
          $oneImg=$this->oneImg($qrcode,$adminList['image'],$adminList['location']);
          //头像下载本地
           $avater=$this->posterHeadimg($adminList['head_img']);
            //合并图片(头像和图一)   图二
          $twoImg=$this->twoImg($avater,$oneImg,$adminList['location']);
           //文字生成图片
            $texts=$this->textImgs($adminList['realname']); 
         合并图片(文字生成图片和图二) 海报
            $poster=$this->threeImg($texts,$twoImg,$adminList['location']);//$adminList['location'] 二维码位置
            if($poster){
               return $poster;
            }else{
               return 0;
            }
       }
    
       public function threeImg($image_2,$image_1,$location){
           if($location == 2){//二维码右下角
             imagecopymerge($image_1, $image_2, 30, 1140, 0,0, imagesx($image_2),imagesy($image_2),100);
           }else{//二维码左下角
                imagecopymerge($image_1, $image_2, 280, 1140, 0,0, imagesx($image_2),imagesy($image_2),100);
           }
           $path = DOC_ROOT.'upload/poster';
           if(!file_exists($path)) {
                  mkdir($path, 0777, true);
               }
            // 输出合成图片
            $merge = 'poster_'.time().'.png';
            imagepng($image_1,'./upload/poster/'.$merge);
            imagedestroy($image_1);
            $newsImg=IMG_PATH.'upload/poster/'.$merge;
            return $newsImg;
         }
    
         //二维码和背景图片生成
        public function oneImg($qrcode,$path_2,$location){
          $image_2=$this->resizeimage($qrcode,220,220,'jpeg');
       //下载阿里图片
           $path_2=$this->posterHeadimg($path_2);
           $imgInfo=getimagesize($path_2);
           if(explode('/',$imgInfo['mime'])[1] == 'jpeg'){
                $image_1=imagecreatefromjpeg($path_2);
           }else{
                $image_1 = imagecreatefrompng($path_2);
           }
            //合成图片
            //将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。两图像将根据 pct 来决定合并程度,其值范围从 0 到 100。当 pct = 0 时,实际上什么也没做,当为 100 时对于调色板图像本函数和 imagecopy() 完全一样,它对真彩色图像实现了 alpha 透明。
            if($location == 2){
               imagecopymerge($image_1, $image_2, 500, 1110, 0,0, imagesx($image_2),imagesy($image_2),100);
            }else{
               imagecopymerge($image_1, $image_2, 50, 1110, 0,0, imagesx($image_2),imagesy($image_2),100);
            }
            return $image_1;
         }
    
         //图片合成生成
          public function twoImg($avater,$image_1,$location){
           $image_2=$this->yuanjiao($avater);
            imagecopymerge($image_1, $image_2, 450, 1660, 0,0, imagesx($image_2),imagesy($image_2),100);
            return $image_1;
         }
    
         //下载阿里图片到本地
        public function posterHeadimg($imgurl){
           $imgs=Cache::get($imgurl);
           // $imgs='';
           if(!$imgs){
              $path = DOC_ROOT.'upload/detele';
               if(!file_exists($path)) {
                   mkdir($path, 0777, true);
               }
               ob_clean();
               ob_start();
               $ext="/".time().".png";
               readfile($imgurl);     //读取图片
               $img=ob_get_contents(); //得到缓冲区中保存的图片
               ob_end_clean();     //清空缓冲区
               $fp = fopen($path.$ext,'w');    //写入图片
               if(fwrite($fp,$img)){
                   fclose($fp);
                   $imgs=IMG_PATH.'upload/detele'.$ext;
                   Cache::set($imgurl,$imgs);
                   return $imgs;
               }
               return false;
           }else{
              return $imgs;
           }
        }
    
        //文字生成图片
        public function textImgs($text){
            // header("Content-type:image/png");
            $im = imagecreatetruecolor(450,300); 
            $white = imagecolorallocate($im, 255, 255, 255); 
            $grey = imagecolorallocate($im, 128, 128, 128); 
            $black = imagecolorallocate($im, 0, 0, 0); 
            imagefilledrectangle($im, 0, 0, 450,300, $white); 
            // Replace path by your own font path 
            $font = DOC_ROOT.'static/font/fonts/simkai.ttf';
            $txt='欢迎来到
    '.$text.'
    提供的多元智慧测评服务';
            imagettftext($im, 27, 0, 20, 40, $black, $font, $txt); 
            return $im;  
        }
    
        public function yuanjiao($avatar){
           $imgInfo=getimagesize($avatar);
              if(explode('/',$imgInfo['mime'])[1] == 'jpeg'){
              $imgpath=$this->resizeimage($avatar,150,150,'jpeg');
              }else{
                  $imgpath=$this->resizeimage($avatar,150,150,'png');
              }
            $ext= pathinfo($imgpath);
            $src_img = null;
            switch ($ext['extension']) {
                case 'jpeg':
                    $src_img = imagecreatefromjpeg($imgpath);
                    break;
                case 'png':
                    $src_img = imagecreatefrompng($imgpath);
                    break;
            }
            $wh  = getimagesize($imgpath);
            $w   = $wh[0];
            $h   = $wh[1];
            $w   = min($w, $h);
            $h   = $w;
            $img = imagecreatetruecolor($w, $h);
            //这一句一定要有
            imagesavealpha($img, true);
            //拾取一个完全透明的颜色,最后一个参数127为全透明
            $bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
            imagefill($img, 0, 0, $bg);
            $r   = $w / 2; //圆半径
            $y_x = $r; //圆心X坐标
            $y_y = $r; //圆心Y坐标
            for ($x = 0; $x < $w; $x++) {
                for ($y = 0; $y < $h; $y++) {
                    $rgbColor = imagecolorat($src_img, $x, $y);
                    if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
                        imagesetpixel($img, $x, $y, $rgbColor);
                    }
                }
            }
            return $img;  
        }
        
        //图片缩放
        public function resizeimage($srcfile,$mySize,$myHeight,$type='png'){
            //因为PHP只能对资源进行操作,所以要对需要进行缩放的图片进行拷贝,创建为新的资源
            if($type === 'png'){
                $src=imagecreatefrompng($srcfile);
            }else{
                $src=imagecreatefromjpeg($srcfile);
            }
            //取得源图片的宽度和高度
            $size_src=getimagesize($srcfile);
            //指定缩放出来的最大的宽度(也有可能是高度)
            $max=$mySize;
            //根据最大值为300,算出另一个边的长度,得到缩放后的图片宽度和高度
            $h=$myHeight;
            $w=$max;
            $path = DOC_ROOT.'upload/detele';
           if(!file_exists($path)) {
                  mkdir($path, 0777, true);
               }
            //声明一个$w宽,$h高的真彩图片资源
            $image=imagecreatetruecolor($w, $h);
            //关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
            imagecopyresampled($image, $src, 0, 0, 0, 0, $w, $h, $size_src['0'], $size_src['1']);
            return $image; 
        }

    已测试。生成速度很快。

    展开全文
  • thinkphp生成海报 Grafika

    2020-08-20 11:28:44
    使用的是Grafika组件,下载及手册 <?...namespace app\api\controller... * 生成海报 * @param $openid 推荐者用户id * @param $qrcodeUrl 二位码将要跳转的链接 */ public function create($openid='', $qrcodeUrl

    使用的是Grafika组件,下载及手册

    <?php
    namespace app\api\controller;
    
    use Grafika\Color;
    use Grafika\Grafika;
    
    class Poster
    {
    	/**
        * 生成海报
        * @param $openid      推荐者用户id
        * @param $qrcodeUrl   二位码将要跳转的链接
        */
    	public function create($openid='', $qrcodeUrl='')
    	{
    		// 背景
            $backgroudImg = "./resource/background_default_567.png";
    
            // 头像
            $user = db('wx_user')->field('nickname,headimgurl')->where('openid', $openid)->find();
            $headimgCir = './resource/headimg/'.$openid.'_c.jpg';
            if (!file_exists($headimgCir)) {
            	
    	        $headimg = './resource/headimg/'.$openid.'.jpg';
    	        if (!file_exists($headimg)) {
    	            // 较快速保存用户头像
    	            $ch = curl_init($user['headimgurl']); 
    		        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    		        $content = curl_exec($ch);
    		        file_put_contents($headimg, $content);
    	        }
    
    	        // 切圆
    	        $circleHeadimgObj = circle($headimg);
    	        imagepng($circleHeadimgObj, $headimgCir);
            }
    
            $filename = date('Y_m_d_H_i_s',time()).mt_rand(111,999); 
            //二维码图片
            $qrcodePath = "./resource/qrcode/".$filename.".png";
            qrcode($qrcodeUrl, 8, $filename);
    
            //生成图片
            $editor = Grafika::createEditor();
            $editor->open($bg, $backgroudImg);          //背景图
            $editor->open($qrcode, $qrcodePath);        //二维码图片
            $editor->open($head, $headimgCir);          //头像
    
            //设置图片大小
            $editor->resizeFit($qrcode, 210, 210);
            $editor->resizeFit($head, 98, 98);
    
            //绑定二维码
            $editor->blend($bg, $qrcode , 'normal', 0.9, 'bottom-right', -32, -21);
            $editor->blend($bg, $head , 'normal', 0.9, 'top-left', 30,30);
            
            // 默认地址不支持中文
            // $font = Grafika::fontsDir() . DIRECTORY_SEPARATOR . 'MSYH.TTC';
            $font = "/static/MSYH.TTF";
            $editor->text($bg ,$user['nickname'], 22, 32, 800, new Color("#FE8A24"), $font);
    
            $posterPath = "./resource/poster/".$filename.".png";
            $editor->save($bg, $posterPath);
    
            unlink($qrcodePath);      //删除二维码
    
            return $posterPath;
        }
    }
    

    切圆方法在common.php中,如下

    /**
    * GD库将正方形图片切为圆形
    * @param 图片相对路径
    */
    function circle($imgpath='')
    {
        $ext = pathinfo($imgpath);
    
        switch ($ext['extension']) {
            case 'jpg':
                $src_img = imagecreatefromjpeg($imgpath);
                break;
            case 'png':
                $src_img = imagecreatefrompng($imgpath);
                break;
            default:
                $src_img = null;
                break;
        }
    
        $temp = getimagesize($imgpath);
        $w = $temp[0];
        $h = $temp[1];
        $w = min($w, $h);
        $h = $w;
    
        $img = imagecreatetruecolor($w, $h);
        imagesavealpha($img, true);
        $bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
        imagefill($img, 0, 0, $bg);
    
        $r = $w / 2;      // 半径
        $y_x = $r;      // 圆心X坐标
        $y_y = $r;      // 圆心Y坐标
    
        for ($x=0; $x < $w; $x++) { 
            for ($y=0; $y < $h; $y++) { 
                $rgbColor = imagecolorat($src_img, $x, $y);
                if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
                    imagesetpixel($img, $x, $y, $rgbColor);
                }
            }
        }
    
        return $img;
    }
    

    生成二维码这里是用了phpqrcode,也在common.php中,这里不作生成二维码详解了

    /**
     * 生成二维码
     * @param  string  $url  url链接
     * @param  integer $size 尺寸 纯数字
     * @param  string  $filename 要保存的文件名称
     */
    function qrcode($url,$size=9,$filename){
        include "../extend/phpqrcode/phpqrcode.php";
        // 如果没有http 则添加
        if (strpos($url, 'http')===false) {
            $url='http://'.$url;
        }
        $filePath = "./resource/qrcode/".$filename.".png";
        QRcode::png($url,$filePath,QR_ECLEVEL_L,$size,2,false,0xFFFFFF,0x000000);
    }
    
    展开全文
  • 主要介绍了PHP实现生成推广海报的方法,结合具体实例形式详细分析了php图片生成的相关操作技巧与相关注意事项,需要的朋友可以参考下
  • 利用微信小程序canvas生成海报分享图片,这个生成图片排版和适配不同尺寸的手机是一个难点,特别是图片适应问题,我处理的方法是动态获取容器的宽度进行适应就是利用微信API wx.createSelectorQuery(),不知道还有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,433
精华内容 4,973
关键字:

生成海报

友情链接: sdevification.rar