电子签名生成的图片为空白,以及生成透明底签名图片转为白色底
电子签名如何解决生成的图片为空白的问题,以及生成透明底签名图片转为白色底
一、生成的图片为空白
项目有个新需求需要加电子签名,在实现的过程中遇到了许多问题,现用的插件笔画延迟非常严重,好不容易做完之后又得换一个插件;换了之后又发现画完图后产生的图片是空白的,百度之后才知道,生成图片调用的 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内的代码没有成功执行。
电子签名生成的图片为空白,以及生成透明底签名图片转为白色底相关推荐
- 【CSS】图片底部空白缝隙处理 ( 使用居中对齐 / 顶部对齐 / 底部对齐 | 将行内元素 / 行内块元素转为块级元素 )
文章目录 一.图片底部空白缝隙问题 二.图片底部空白缝隙问题解决方案一 ( 使用居中对齐 / 顶部对齐 / 底部对齐 ) 三.图片底部空白缝隙问题解决方案二 ( 将行内元素 / 行内块元素转为块级元素 ...
- python使用opencv方法将签名图片自动插入到图片任意位置
三.将签名图片插入到图片底部 方法一:通过操作像素点将图片遍历到原图 原理: 现有待插入图片(jpg\png)格式.手写签名png图片 0.利用opencv修改图片大小 1.使用numpy将两张图片的 ...
- python将图片生成视频,和空白视频
直接上代码,我这里以一张图片演示. 以这张图片为例,代码如下: import cv2 import os import numpy as npfps = 30 size = (1280, 720) n ...
- Html2canvas——生成画布时图片显示空白
问题:用html2canvas生成画布图片,再转成pdf.生成图片时内容结构里的图片显示空白. 解决: 首先服务器设置图片允许跨域,如阿里云腾讯云配置跨域规则.其次图片设置crossOrigin=&q ...
- 微信小程序canvas合成图片(海报),生成的图片展示不出来,或者空白。
背景: 1.用户点击分享朋友圈,将二维码与一张背景图合成一张图片,然后将其显示. 2.用户点击保存图片将图片保存到手机相册里面. 问题: 用户点击分享盆友圈合成后的图片显示空白.控制台可以打印出来链接 ...
- Itext生成pdf文件,itext+Freemarker生成pdf,(中文空白解决)
来源:https://my.oschina.net/lujianing/blog/894365 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等. ...
- html生成真正的空图片代码 用canvas和script生成无实质性的空白图像 比图像透明处理还要牛 那种空白透明头像就是这么做出来的
我看到有些朋友还在用PS等图片处理软件编辑纯色图片变透明的操作,实质上图像透明化,并非真正意义上的图片看不到了,只是图片透明化了而已,如果处理不当,还是可以看到图片细微的颜色的.有没有真正意义上的空白 ...
- php把buffer转化为图片_长微博生成(将html转化为图片)原理浅析
在平时工作中有一些需求,简单而言就是需要将一些内容生成图片.简单的内容通过PhotoShop处理还行,但是类似于带表格等的内容,每次都通过PhotoShop进行处理太浪费时间.网上有很多类似于长微博等 ...
- 如何使用Java快速地给图片转码和生成缩略图(Thumbnailator和webp-imageio-core的使用)
文章简介 本文中介绍,如何使用Java优雅处理图片:包括:主流图片格式转码.图片压缩(缩略图生成)等.主要用到的外部工具包: Google Thumbnailator webp-imageio-cor ...
最新文章
- (解释)常见的无线路由器采用( A)技术。 A. WiFi B. AP C. UWB D. ZigBee
- syskey——让你的电脑更加安全
- Django中HttpResponse和JsonResponse的区别和用法
- 学了这些技术就能轻松找到一份待遇不错的岗位
- 大话设计模式—原型模式
- 女生学医检好还是学计算机好,女生学医选择什么专业好?
- Javascript 强制浏览器渲染Dom文档
- pycharm是python2.还是3_Pycharm:Python2和3及其的Anaconda的正确设置
- 无法关闭microsoft word_仅记录word文档损坏后的挣扎(亲历)
- Blocking waiting for file lock on package cache 后续
- Python3入门机器学习经典算法与应用 第3章 Jupyter Notebook基本用法 学习笔记
- 微博表情 文本与图片对照表
- 多项式算法的常数问题
- Mybatis框架中Oracle使用BLOB字段存储图片并展示(详细步骤)
- phalapi 开发流程
- 前端图表制作——HighCharts图表入门
- php中插入word文档,word里如何插入pdf
- 腾讯笔试算法题-开锁
- 971. 翻转二叉树以匹配先序遍历
- 原来开车和写博客是很相似的心理变化过程
热门文章
- 基本的信号——冲激信号与冲激序列
- java判断值是枚举类型?
- To install it ,you can run npm i -- save vuetypesumd
- vue報錯 To install it, you can run: npm install --save vue/types/umd
- Python使用 matplotlib的basemap绘图之一--几行代码画世界地图和中国地图
- 性别识别_文字性别识别_语音性别识别 - 云+社区 - 腾讯云
- 视频配音怎么配出好听的声音?试试这三个视频配音方法
- 小米 笔记本 Pro 点击excel 文件夹 未响应 卡死 如何解决
- JavaScript进阶(二):BOM对象详解
- MySQL日期差,时间差,使用DATEDIFF、TIMESTAMPDIFF函数