电子签名如何解决生成的图片为空白的问题,以及生成透明底签名图片转为白色底

一、生成的图片为空白

项目有个新需求需要加电子签名,在实现的过程中遇到了许多问题,现用的插件笔画延迟非常严重,好不容易做完之后又得换一个插件;换了之后又发现画完图后产生的图片是空白的,百度之后才知道,生成图片调用的 uni.canvasToTempFilePath 接口必须要在 draw()回调使用
并且需要异步调用,在图片生成好之后再将它上传到服务器上,否则上传之后回显的图片就是空白的。
在 useCanvans.js 文件里

// 生成图片调用的uni.canvasToTempFilePath接口必须要在draw()回调使用,
// 否则可能生成空白图片,异步方法保证等待图片完成了再上传到服务器
function saveCanvas() {return new Promise((resolve, rej) => {params.ctx.draw(true,createFileUrl().then((res) => {resolve(res);}));});
}function createFileUrl() {return new Promise((resolve, rej) => {uni.canvasToTempFilePath({canvasId: 'handWriting',fileType: 'png',quality: 1, //图片质量success(res) {console.log(res.tempFilePath, 'canvas生成图片地址');resolve(res.tempFilePath);},fail: function (err) {console.log('图片生成失败:' + err);},});});
}

在需要调用生成图片 api 的文件里异步调用:

      saveCanvas().then((res) => {console.log('%c [ tempFilePath ]','font-size:13px; background:pink; color:#bf2c9f;',res);wx.uploadFile({...});});

二、透明底签名图片转为白色底

第一次尝试
使用第二个插件中,有一个函数的注释说明转背景为白色,但是引入这个插件后生成的图片却还是透明的

         onLoad() {this.ctx = uni.createCanvasContext("handWriting");this.$nextTick(() => {uni.createSelectorQuery().select('.handCenter').boundingClientRect(rect => {this.canvasWidth = rect.width;this.canvasHeight = rect.height;/* 将canvas背景设置为 白底,不设置  导出的canvas的背景为透明 */this.setCanvasBg('#fff');}).exec();});},//设置canvas背景色  不设置  导出的canvas的背景为透明//@params:字符串  colorsetCanvasBg(color) {/* 将canvas背景设置为 白底,不设置  导出的canvas的背景为透明 *///rect() 参数说明  矩形路径左上角的横坐标,左上角的纵坐标, 矩形路径的宽度, 矩形路径的高度//这里是 canvasHeight - 4 是因为下边盖住边框了,所以手动减了写this.ctx.rect(0, 0, this.canvasWidth, this.canvasHeight - 4);// ctx.setFillStyle('red')this.ctx.setFillStyle(color);this.ctx.fill(); //设置填充this.ctx.draw(); //开画}

第二次尝试
一开始还以为是我理解错了,上面那个方法不是转白色底方法,于是又去网上找了其他方法:使用 wx.canvasGetImageData 和 wx.canvasPutImageData 改变图片的底色。

function toWhite() {console.log('%c [ width ]','font-size:13px; background:pink; color:#bf2c9f;');wx.canvasGetImageData({canvasId: 'handWriting',x: 0,y: 0,width: params.canvasWidth,height: params.canvasHeight,success(res) {console.log(res.width); // 100console.log(res.height); // 100console.log(res.data instanceof Uint8ClampedArray); // trueconsole.log(res.data.length); // 100 * 100 * 4var imageData = res.data;for (var i = 0; i < imageData.length; i += 4) {// 当该像素是透明的,则设置成白色if (imageData[i + 3] === 0) {imageData[i] = 255;imageData[i + 1] = 255;imageData[i + 2] = 255;imageData[i + 3] = 255;}}wx.canvasPutImageData({canvasId: 'handWriting',x: 0,y: 0,width: params.canvasWidth,height: params.canvasHeight,data: imageData,success(res) {console.log('%c [ toWhite ]','font-size:13px; background:pink; color:#bf2c9f;',res);},});},});
}

尝试过后发现还是不行,调试的错误信息显示传入的 width 为 0,这才发现前面获取宽高失败了,于是写死传入的宽高尝试了一下,发现还是不可以,但是让我想明白了为什么第一次尝试失败,也是因为在 setCanvasBg 函数中传入的宽高为 0。

this.ctx.rect(0, 0, this.canvasWidth, this.canvasHeight - 4);

传入正确的宽高之后果然成功了,但是要注意如果宽高是动态的话,一定要在设置底色前将宽高获取,否则生成的第一张签名还是透明底。
但是还是不明白为什么在初始化时获取宽高失败,很可能是由于this.$nextTick内的代码没有成功执行。

电子签名生成的图片为空白,以及生成透明底签名图片转为白色底相关推荐

  1. 【CSS】图片底部空白缝隙处理 ( 使用居中对齐 / 顶部对齐 / 底部对齐 | 将行内元素 / 行内块元素转为块级元素 )

    文章目录 一.图片底部空白缝隙问题 二.图片底部空白缝隙问题解决方案一 ( 使用居中对齐 / 顶部对齐 / 底部对齐 ) 三.图片底部空白缝隙问题解决方案二 ( 将行内元素 / 行内块元素转为块级元素 ...

  2. python使用opencv方法将签名图片自动插入到图片任意位置

    三.将签名图片插入到图片底部 方法一:通过操作像素点将图片遍历到原图 原理: 现有待插入图片(jpg\png)格式.手写签名png图片 0.利用opencv修改图片大小 1.使用numpy将两张图片的 ...

  3. python将图片生成视频,和空白视频

    直接上代码,我这里以一张图片演示. 以这张图片为例,代码如下: import cv2 import os import numpy as npfps = 30 size = (1280, 720) n ...

  4. Html2canvas——生成画布时图片显示空白

    问题:用html2canvas生成画布图片,再转成pdf.生成图片时内容结构里的图片显示空白. 解决: 首先服务器设置图片允许跨域,如阿里云腾讯云配置跨域规则.其次图片设置crossOrigin=&q ...

  5. 微信小程序canvas合成图片(海报),生成的图片展示不出来,或者空白。

    背景: 1.用户点击分享朋友圈,将二维码与一张背景图合成一张图片,然后将其显示. 2.用户点击保存图片将图片保存到手机相册里面. 问题: 用户点击分享盆友圈合成后的图片显示空白.控制台可以打印出来链接 ...

  6. Itext生成pdf文件,itext+Freemarker生成pdf,(中文空白解决)

    来源:https://my.oschina.net/lujianing/blog/894365 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等. ...

  7. html生成真正的空图片代码 用canvas和script生成无实质性的空白图像 比图像透明处理还要牛 那种空白透明头像就是这么做出来的

    我看到有些朋友还在用PS等图片处理软件编辑纯色图片变透明的操作,实质上图像透明化,并非真正意义上的图片看不到了,只是图片透明化了而已,如果处理不当,还是可以看到图片细微的颜色的.有没有真正意义上的空白 ...

  8. php把buffer转化为图片_长微博生成(将html转化为图片)原理浅析

    在平时工作中有一些需求,简单而言就是需要将一些内容生成图片.简单的内容通过PhotoShop处理还行,但是类似于带表格等的内容,每次都通过PhotoShop进行处理太浪费时间.网上有很多类似于长微博等 ...

  9. 如何使用Java快速地给图片转码和生成缩略图(Thumbnailator和webp-imageio-core的使用)

    文章简介 本文中介绍,如何使用Java优雅处理图片:包括:主流图片格式转码.图片压缩(缩略图生成)等.主要用到的外部工具包: Google Thumbnailator webp-imageio-cor ...

最新文章

  1. (解释)常见的无线路由器采用( A)技术。 A. WiFi B. AP C. UWB D. ZigBee
  2. syskey——让你的电脑更加安全
  3. Django中HttpResponse和JsonResponse的区别和用法
  4. 学了这些技术就能轻松找到一份待遇不错的岗位
  5. 大话设计模式—原型模式
  6. 女生学医检好还是学计算机好,女生学医选择什么专业好?
  7. Javascript 强制浏览器渲染Dom文档
  8. pycharm是python2.还是3_Pycharm:Python2和3及其的Anaconda的正确设置
  9. 无法关闭microsoft word_仅记录word文档损坏后的挣扎(亲历)
  10. Blocking waiting for file lock on package cache 后续
  11. Python3入门机器学习经典算法与应用 第3章 Jupyter Notebook基本用法 学习笔记
  12. 微博表情 文本与图片对照表
  13. 多项式算法的常数问题
  14. Mybatis框架中Oracle使用BLOB字段存储图片并展示(详细步骤)
  15. phalapi 开发流程
  16. 前端图表制作——HighCharts图表入门
  17. php中插入word文档,word里如何插入pdf
  18. 腾讯笔试算法题-开锁
  19. 971. 翻转二叉树以匹配先序遍历
  20. 原来开车和写博客是很相似的心理变化过程

热门文章

  1. 基本的信号——冲激信号与冲激序列
  2. java判断值是枚举类型?
  3. To install it ,you can run npm i -- save vuetypesumd
  4. vue報錯 To install it, you can run: npm install --save vue/types/umd
  5. Python使用 matplotlib的basemap绘图之一--几行代码画世界地图和中国地图
  6. 性别识别_文字性别识别_语音性别识别 - 云+社区 - 腾讯云
  7. 视频配音怎么配出好听的声音?试试这三个视频配音方法
  8. 小米 笔记本 Pro 点击excel 文件夹 未响应 卡死 如何解决
  9. JavaScript进阶(二):BOM对象详解
  10. MySQL日期差,时间差,使用DATEDIFF、TIMESTAMPDIFF函数