html5将文字生成图片

2023-11-11

由于canvas能够将画布上的纹理生成数据给img显示出来,所以,我们在html5里面可以实现将文字生成图片显示。

首先我书写了一个将文字绘制到canvas上面的函数,然后函数会返回canvas绘制的纹理数据。

//绘制文字到canvas,判断换行位置,和设置canvas高度
    function canvasWrapText(options) {
        var settings = {
            canvas:document.getElementsByTagName("canvas")[0], //canvas对象,必填,不填写默认找到页面中的第一个canvas
            canvasWidth:480, //canvas的宽度
            drawStartX:10, //绘制字符串起始x坐标
            drawStartY:30, //绘制字符串起始y坐标
            lineHeight:30, //文字的行高
            font:"24px 'Microsoft Yahei'", //文字样式
            text:"请修改掉默认的配置", //需要绘制的文本
            drawWidth:460, //文字显示的宽度
            color:"#000000", //文字的颜色
            backgroundColor:"#ffffff", //背景颜色
        };

        //将传入的配置覆盖掉默认配置
        if(!!options && typeof options === "object"){
            for(var i in options){
                settings[i] = options[i];
            }
        }

        //获取2d的上线文开始设置相关属性
        var canvas = settings.canvas;
        canvas.width = settings.canvasWidth;
        var ctx = canvas.getContext("2d");

        //绘制背景色
        ctx.fillStyle = settings.backgroundColor;
        ctx.fillRect(0,0,canvas.width,canvas.height);

        //绘制文字
        ctx.font = settings.font;
        ctx.fillStyle = settings.color;
        var lineWidth = 0; //当前行的绘制的宽度
        var lastTextIndex = 0; //已经绘制上canvas最后的一个字符的下标
        //由于改变canvas 的高度会导致绘制的纹理被清空,所以,不预先绘制,先放入到一个数组当中
        var arr = [];
        for(var i = 0; i<settings.text.length; i++){
            //获取当前的截取的字符串的宽度
            lineWidth = ctx.measureText(settings.text.substr(lastTextIndex,i-lastTextIndex)).width;
            
            if(lineWidth > settings.drawWidth){
                //判断最后一位是否是标点符号
                if(judgePunctuationMarks(settings.text[i-1])){
                    arr.push(settings.text.substr(lastTextIndex,i-lastTextIndex));
                    lastTextIndex = i;
                }else{
                    arr.push(settings.text.substr(lastTextIndex,i-lastTextIndex-1));
                    lastTextIndex = i-1;
                }
            }
            //将最后多余的一部分添加到数组
            if(i === settings.text.length - 1){
                arr.push(settings.text.substr(lastTextIndex,i-lastTextIndex+1));
            }
        }

        //根据arr的长度设置canvas的高度
        canvas.height = arr.length*settings.lineHeight+settings.drawStartY;

        ctx.font = settings.font;
        ctx.fillStyle = settings.color;
        for(var i =0; i<arr.length; i++){
            ctx.fillText(arr[i],settings.drawStartX,settings.drawStartY+i*settings.lineHeight);
        }

        //判断是否是需要避开的标签符号
        function judgePunctuationMarks(value) {
            var arr = [".",",",";","?","!",":","\"",",","。","?","!",";",":","、"];
            for(var i = 0; i< arr.length; i++){
                if(value === arr[i]){
                    return true;
                }
            }
            return false;
        }

        return canvas.toDataURL();
    }

    //调用函数获取到img的data数据
    var data = canvasWrapText({canvas:document.getElementById("canvas"),text:string});
然后将获取到的data数据赋值给img的src,然后这个img就会显示出来canvas设置的数据,然后将图片保存即可。

//创建一个img对象,在页面上显示打印的数据
    var img = document.createElement("img");
    img.src = data;
    document.body.appendChild(img);

具体代码请看案例网址:

https://johnson2heng.github.io/PicClipUpload/text.html




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

html5将文字生成图片 的相关文章

随机推荐

  • css禁止滑动页面_弹出层完美禁止页面滚动

    Html Css Js 弹出层去除背景滚动 原生版 使用js构建的弹出层类 使用new的方式实例化 传入的参数为 el 触发元素 click触发弹出层 content 弹出层内容 time 0 显示持续时间 使用 passive 事件和ov
  • mysql一对多关联查询语句_mysql 一对多的时分 关联查询 筛选多方

    mysql 一对多的时候 关联查询 筛选多方 users 表和 auth token log表是一对多 现在是把user的信息找出来 关联上一些 auth token log表的数据 因为a表是多的一方 要多他的数据进行一些条件匹配 这个s
  • 数字化时代-7:从三大产业看赚钱的立足点

    摘要 通过观察不同产业的发展特点 发现社会发展的趋势 农业社会 工业社会 信息社会 虚拟社会演进 物质产品生产 精神产品的生产 把握大势 让猪遇到风飞起来 违背大势 飞机也会坠毁 何为产业 主要是指在经济社会中 能够生产某种类型产品的部门的
  • 出门问问把AIGC看得很透彻

    图片来源 Pixabay 李志飞将AIGC看得很透 他可能是行业里 最不着急 的人 数科星球原创 作者丨苑晶 编辑丨大兔 几乎每一个行业 从业者都是国外的2倍 利润又是同行的1 5 让中国的创业难度提升了10倍 李志飞的这句话适用于广大行业
  • Echarts 各种点击事件监听

    目录 一 鼠标事件 1 1 左击 1 2 双击 1 3 右击 1 4 右键双击 1 5 中轴滚动 二 时间轴 2 1 时间轴监听 三 拖动 3 1 拖动事件 一 鼠标事件 1 1 左击 chart on click function par
  • 乘积尾零(蓝桥杯省赛2018C/C++A组第三题)

    题目 如下的 10 行数据 每行有 10 个整数 请你求出它们的乘积的末尾有多少个零 5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3
  • 图像分类篇:实现pytorch官网demo(LeNet)

    跟着b站up主学习整理 2 1 pytorch官方demo Lenet 哔哩哔哩 bilibili 目录 一 CNN的雏形 LeNet网络结构 二 官网demo文件 三 代码实现 1 model py 2 train py 3 predic
  • 最酷炫的Python进度条使用教程

    原文链接 https mp weixin qq com s gRpNq15bX4OgpiY5NNO OQ 效果展示 基础使用 导入 alive progress 库 from alive progress import alive bar
  • overleaf入门教程

    overleaf入门教程 中文学习文档 供自己学习记录 1 编译中文 输入内容为中文时 有两种方式 需要将 documentclass article 改为 documentclass ctexart 或者引用宏包 usepaceage c
  • 获取每个年龄段的人数

  • Android 实现无需权限的悬浮球效果,可适配至Android 10

    前言 最近闲来无事 突然想起搞一下悬浮球 之前的项目的悬浮球一直都需要授权 android6 0以后需要手动授权 悬浮球使用时就非常不便 这里为大家带来一种无需权限的悬浮球实现方式 无需权限 无需权限 功能 自动贴边 显示红点 隐藏红点 自
  • 微信小程序—tabBar导航栏

    1 什么是tabBar tabBar是移动端应用常见的页面效果 用于实现多页面的快速切换 小程序中常分为 底部 tabBar 顶部 tabBar 2 tabBar 节点的配置项 position tabBar的位置 仅支持bottom to
  • python操作mysql数据库详解

    使用Python操作MySQL数据库 MySQL是一种关系型数据库管理系统 它可以用来存储和管理大量的数据 之前介绍了大部分主流数据库 今天将介绍如何使用Python来操作MySQL数据库 安装MySQL 首先 我们需要安装MySQL服务器
  • 测试数据埋点

    简单理解下 埋点其实就是在程序中的某个位置加一个标记 当用户触发到某个行为的时候 就采集一下数据 然后将数据上报到某个位置进行存储 埋点的最终目的是收集到相关的数据 用于给运营人员提供数据支撑等 什么是埋点测试 埋点也分前端埋点和后端埋 前
  • LR(1)算法

    构造出LR 1 项的规范族 先从起始状态设为CC0 然后对于每一个语法符号构造出下一个CCX 意味着吸收了这个语法符号后可能到达的状态 运用不动点算法不断迭代 构造出CCI 意思是如果输入某个符号 可能到达的状态 吸收算法更精妙 即将状态与
  • 织梦DedeCms文章标题字数限制的解决方法

    织梦系统默认的文章标题字数限制是60 也就是30个汉字 不够用怎么办 很简单 只需两步搞定织梦DedeCms文章标题字数的限制 1 在后台选择系统 gt 其它选项 gt 文档标题最大长度改此参数后需要手工修改数据表修改为需要设置的标题最大长
  • 启动服务失败,Java HotSpot(TM) 64-Bit Server VM warning: error='Cannot allocate memory' (errno=12)

    反复启动 down了又起 没起成功down了又起 反复操作了三遍 应用服务 有多个netty服务端 的时候报这个错误 RealServer Start OK 2018 10 30 15 46 52 INFO 2018 10 30 15 46
  • HDU 1106 排序

    题目 输入一行数字 如果我们把这行数字中的 5 都看成空格 那么就得到一行用空格分割的若干非负整数 可能有些整数以 0 开头 这些头部的 0 应该被忽略掉 除非这个整数就是由若干个 0 组成的 这时这个整数就是0 你的任务是 对这些分割得到
  • 【秒懂+解决方案】git error: The following untracked working tree files would be overwritten by checkout: ...

    问题分析 问题出在 Error 所列出的文件在本地的当前分支下未授权给 git 追踪 但同样命名的文件 也即出现在另一个 远程 分支下的同一文件却正在远程仓库或其它分支被 git 进行追踪 接下来的操作 git merge checkout
  • html5将文字生成图片

    由于canvas能够将画布上的纹理生成数据给img显示出来 所以 我们在html5里面可以实现将文字生成图片显示 首先我书写了一个将文字绘制到canvas上面的函数 然后函数会返回canvas绘制的纹理数据 绘制文字到canvas 判断换行