【小程序】--------------处理canvas导出图片模糊问题-------------【劉】

一、业务需求:

    使用canvas在前端生成海报,并在海报上添加上水印。最后导出图片并保存到本地。

二、业务逻辑实现:

  (1)创建canvas画布======》(2)在canvas上绘制海报========》(3)绘制水印===========》(4)绘制完成,导出图片路径=========》(5)保存到本地,并可以分享,(长按保存图片)

三、代码实现:

  

(1)、创建画布并将图片和水印绘制到canvas上const ctx = wx.createCanvasContext(‘myCanvas‘);
ctx.drawImage("https://img******.jpg", 0, 0, 300, 400);

 ctx.drawImage("../../images/tools/water.png", ox, oy, ow, oh);

ctx.draw();

  网络图:

  如果是用网络图,则在模拟器上正常显示。则在手机上无法显示创建。

  因为canvas.drawImage 是不支持网络图片的,只支持本地图片。所以,任何网络图片都需要先缓存到本地,在通过 drawImage 调用储存的本地资源进行绘制,缓存通过 wx.getImageInfo实现。代码如下

let _that = this

wx.getImageInfo({
src: ‘https://img******.jpg‘,
success: function (res) {

    let width = res.width

    let height = res.height

    let type = res.type
    let path = res.path
    ctx.drawImage(path, 0, 0, 300, 400);
    ctx.drawImage("../../images/tools/water.png", 20, 20, 30, 40);
    ctx.draw()
  }

})

通过success回调函数可以获取网络图片的宽高路径,和图片的格式png、jpg、svg。。。。。。

 还有一点需要注意的是 draw 方法是异步的,如果图片还没加载成功,有可能画出来的是空的,所以 draw 方法后的回调导出图片

通过wx.canvasToTempFilePath

ctx.draw(true, (res) => {
wx.canvasToTempFilePath({
  x: 0,
  y: 0,
  width: 50,
  height: 50,
  destWidth: 100,
  destHeight: 100,
  canvasId: ‘myCanvas‘,
  success(res) {
    console.log(res.tempFilePath)
  }
})
 });

  

  保存图片到本地

通过wx.saveImageToPhotosAlbum将图片保存到本地

wx.saveImageToPhotosAlbum({
                filePath: res.tempFilePath,
                success(res) {
                  console.log("保存成功")
                  _that.showSaveSuccess()
                },
                fail() {
                  wx.showModal({
                    title: ‘保存到相册失败‘,
                    content: ‘请点击图片,长按图片保存‘,
                    showCancel: false
                  })
                }
              })

图片模糊问题

  然而,在导出图片时,那就是canvas生成的图片保存后很模糊。

  (1)、使用两个canvas进行绘图,一个canvas用于绘图展示。用另一个canvas设置和图片大小一样。用于导出图片时的绘制。设置opacity为0.不能设置display:none。

    问题:但实际上上这个方案有一点问题:其一,生成需要两个画布;其二,绘制过大画布在安卓上面会出现问题,官方文档里也提示了避免设置过大的宽高,在安卓下会有crash的问题。

  (2)、使用scale缩放画布,设置canvas的画布于图片大小一样。则用scale缩放到需要展示的大小。则在导出时不会出现模糊问题。

    问题:在模拟器上是没有问题的,但是在真机上调试是没有效果的。

  (3)、本质上就是生成一个更大的图片,因为手机的屏幕设备的像素比现在一般都是超过2的。实际上我们只需要在使用wx.canvasToTempFilePath的时候,设置参数destWidth和destHeight(输出的宽度和高度)为width和height的2倍以上即可。

    当然,这个具体数值也可以wx.getSystemInfo这个API来获取设备的像素比了(pixelRatio),这个像素比作为以上数值。

    在onLode函数中通过wx.getSystemInfo获取像素比(pixelRatio)。则在导出图片时需要设置

    destWidth:width * pixelRatio

    destHeight:height * pixelRatio

  

原文地址:https://www.cnblogs.com/lstcon/p/10930046.html

时间: 2024-08-18 21:26:52

【小程序】--------------处理canvas导出图片模糊问题-------------【劉】的相关文章

前端小程序——js+canvas 给图片添加水印

市场上各种各样的图片处理器有很多,那么作为程序员的我们是不是应该自己做一个呢?那就从加水印开始吧 html: <canvas id="shuiyinTest"> </canvas> <div> <input id="shuiyinText" value="" type="text"/> <button id="shuiyinBtn" class=&quo

.net core 3.1 webapi后端接收钉钉小程序post的文件/图片

原文:.net core 3.1 webapi后端接收钉钉小程序post的文件/图片 世上本没路:走的人多了,便成了路. dd.uploadFile({ url: '请使用自己服务器地址', fileType: 'image', fileName: 'file', filePath: '...', success: (res) => { dd.alert({ content: '上传成功' }); }, }); 这就是官网上的例子,没有后端的.但是我猜这是用"Form"进行pos

微信小程序之canvas画图生成图片下载

要实现的功能:点击朋友圈按钮弹出分享图片:点击保存分享图片保存到手机实现代码:1.分享按钮点击事件 /** * 分享 */ weixinShare:function(){ var that = this; console.log(111); share.canvasImg((res)=>{ console.log(222); that.setData({ imagePath: res.tempFilePath, bgShare:false, left:43 }); }); } 2.生成图片 /*

利用canvas 导出图片

使用canvas绘制图片,并将图片导出. 将不同域下图片绘制到canvas上时,不能使用toDataURL来获取imgdata,因为 canvas 使用了没有权限的跨域图片在使用canvas.toDataURL()等数据导出函数的时候会报错! img.crossOrigin = "Anonymous" ,它开启了本地的跨域允许.当然服务器存储那边也要开放相应的权限才行,如果是设置了防盗链的图片在服务端就没有相应的权限的话你本地端开启了权限也是没有用的. function downloa

微信小程序多张image图片排列有空隙解决方案

上个项目是卖东西的,商品详情传的组图,排上去后发现每张图片下有大概10+rpx的下边距,显得很不好看.查了一下貌似是小程序的默认样式.没找到解决方案,看到有说用微信编辑器传图的,好像很麻烦就没去试,自己琢磨了两种方法. 原本不做处理的样子: .det-pics-w image { width: 100%; min-height: 630rpx; } .det-pics-w { position: relative; } 第一种解决方案:flex .det-pics-w image { width

小程序开发二三事--图片错误显示默认图

小程序的image组件不像普通html 的image,没有onerror属性,不过有个binderror回调方法.却不像onerror="this.src='/static/img/fmdefault.png'"来的方便. binderror 当错误发生时,发布到 AppService 的事件名,事件对象event.detail = {errMsg: 'something wrong'}; 当图片错误时,调用binderror方法,然后去改变image的src绑定的值. <ima

wx小程序用canvas生成图片流程与注意事项

1.需要画入canvas的 图片都需要先缓存到本地 let ps = [] ps.push(that.loadImageFun(this.statusInfo.avatar_url, "headImg")) Promise.all(ps).then(res => { // 画图 }) loadImageFun(url, index) { let _this = this return new Promise((resolve, reject) => { wx.downloa

小程序真机调试图片可以成功上传,但是线上版本和体验版手机上上传老保图片报错?

配置好上传的域名 上传的图片的域名后来更换了但是小程序后台没换,重新加下就好了. 灵感链接: https://developers.weixin.qq.com/community/develop/doc/00004449ea460025fde8f3ebb56c00 原文地址:https://www.cnblogs.com/pikachuworld/p/11565497.html

微信小程序左右滑动切换图片酷炫效果(附效果)

开门见山,先上效果吧!感觉可以的用的上的再往下看. 心动吗?那就继续往下看! 先上页面结构吧,也就是wxml文件,其实可以理解成微信自己封装过的html,这个不多说了,不懂也没必要往下看了. 1 <scroll-view class="scroll-view_H" scroll-x scroll-with-animation style="width: 100%;height:{{windowHeight}}px" bindscroll="getSe