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

这篇具有很好参考价值的文章主要介绍了电子签名生成的图片为空白,以及生成透明底签名图片转为白色底。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、生成的图片为空白

项目有个新需求需要加电子签名,在实现的过程中遇到了许多问题,现用的插件笔画延迟非常严重,好不容易做完之后又得换一个插件;换了之后又发现画完图后产生的图片是空白的,百度之后才知道,生成图片调用的 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:字符串  color
			setCanvasBg(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); // 100
      console.log(res.height); // 100
      console.log(res.data instanceof Uint8ClampedArray); // true
      console.log(res.data.length); // 100 * 100 * 4
      var 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内的代码没有成功执行。文章来源地址https://www.toymoban.com/news/detail-485036.html

到了这里,关于电子签名生成的图片为空白,以及生成透明底签名图片转为白色底的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图像处理(1):用Python实现彩色图像转为灰度图像的两种方法以及批量将图片转为灰度图

    用Python实现彩色图像转为灰度图像的两种方法介绍 这篇文章给大家主要介绍使用 Python 将彩色图像转为灰度图像的两种方法,以及用 Python 批量将图片转为灰度图的方法,供大家参考: 使用Python中的cv2库,它自带彩色转灰度的方法,并且代码非常简单。 先读取一张彩色图片,然

    2024年02月11日
    浏览(50)
  • 【前端】html2canvas生成图片空白排查data:;(js vue react uniapp)

    因为要做一个分享图,就用到了html2canvas,一开始是好好的,今天随便测了下,发现图片显示不出来了。打印了下,生成的图片链接变成了 data:; 。后面一步一步地排查,发现是页面内容太多了,删减一点内容就能显示出来。然后我又去认真看了下html2canvas的各个参数,发现可

    2024年02月03日
    浏览(59)
  • openssl 生成自签名证书以及CA证书链

    执行命令后,会提示你输入一些内容,请按照提示输入,每一项输入的内容需要自己记住 其中root.ext手动创建,内容如下: 中间证书的制作过程与根证书类似,这里直接将命令贴上。 这里涉及到一个ca_intermediate.ext,和root.ext类似,需要手动创建,内容如下 输出结果应该如下所

    2024年02月09日
    浏览(46)
  • vue3+element Plus+ts 自定义主题色,以及生成主题色各种透明度

    目录 思路  安装css-color-function【接收一个颜色值,生成不同的透明度】 获取后台配置的主题色或者使用ColorPicker修改主题色  最终结果如下 本篇文章的主体思路是从element Plus官网引申而来。结合了我以前用vue2+element-ui配置主题色生成透明度(light-1至linght-9)的方法。 utils/

    2024年02月21日
    浏览(51)
  • uniapp 小程序 多张图片生成海报以及下载海报

    上代码 下载海报 我的上一篇博客有后半部分图片保存代码! 搞定! 日常开发代码记录。

    2024年04月25日
    浏览(42)
  • c# 通过webView2模拟登陆小红书网页版,解析无水印视频图片,以及解决X-s,X-t签名验证【2023年4月29日】

    一、c# WebView2简介   1.一开始使用WebBrowser,因为WebBrowser控件使用的是ie内核,经过修改注册表切换为Edge内核后, 发现Edge内核版本较低,加载一些视频网站提示“浏览器版本过低“,”视频无法加载“。 2.WebBrowser内核版本与WebView2比较 WebBrowser内核版本: 内核版本 (Version) E

    2024年02月05日
    浏览(63)
  • 在浏览器中使用javascript打印HTML中指定Div带背景图片内容生成PDF电子证书查询的解决方案

    要调用浏览器中的打印功能,并指定需要打印的内容为特定的DIV内的内容,你可以使用JavaScript来实现。下面是一种实现方法: 首先,在需要打印的DIV标签上添加一个唯一的ID属性,例如: 接下来,在JavaScript中使用 window.print() 方法来调用浏览器的打印功能,并指定打印的内容

    2024年02月13日
    浏览(61)
  • 电子签和电子签名法解读

    随着互联网和信息技术的快速发展,越来越多的业务和合同签订过程逐渐转向线上。在这一过程中,电子签和电子签名法成为了人们关注的焦点。本文将对电子签和电子签名法进行解读,探讨它们在现实生活中的应用和意义。 一、电子签和电子签名法的背景和意义 电子签和

    2024年02月10日
    浏览(47)
  • 生成随机mask以及根据mask对两幅图片进行合并

    对图像处理的一些操作还是需要掌握的嘿嘿 这里代码参考MAT的一份代码: https://github.com/fenglinglwb/MAT/blob/main/datasets/mask_generator_256.py 封装一下生成mask函数 调用一下 这里以celeba-256为例子 调用一下 000255.jpg 001133.jpg 000255_001133.jpg

    2024年02月14日
    浏览(47)
  • OpenCV - 图片增加透明通道,图片合并透明通道

    一般人像抠图相关的AI模型会输出一个Mask图,这个Mask图就是我们需要的可以将人物抠出来的Alpha通道信息,我们需要将这个Mask图附加到原始图片上,从BGR图片转成BGRA图片或者从RGB图片转成RGBA图片。 如果使用OpenCV进行图像处理,在为图像增加透明通道时会使用到 cv::split 和

    2024年02月16日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包