一、业务需求:

使用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 方法后的回调导出图片

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({

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

android canvas png 失真,【小程序】--------------处理canvas导出图片模糊问题-------------【劉】...相关推荐

  1. uniapp实现canvas制作微信小程序海报,线上图片

    先看下效果图 生成海报后,点击保存到相册,会调起请求权限,是否同学调用我们的相册,允许之后,这张海报就会自动存入我们的相册 具体实现: <view class='canvas-box' v-sh ...

  2. android分享分享到朋友圈图片,android app分享微信小程序(包含封面网络图片)+图片到朋友圈...

    A 分享微信小程序效果: image.png 实现代码 //第一步通过url拿网络图片并生成bitmap val path = "分享小程序某个界面包含传参数" if (!Text ...

  3. uniapp 手写canvas海报(兼容android/ios/h5/微信小程序)

    先上成功图 1.在父组件里面定义弹出层,并且调用子组件制作海报的方法 2.点击显示二维码调用子组件海报方法 showPoster(customerPostId) {             // co ...

  4. 【微信小程序canvas】实现小程序手写板用户签名(附代码)

    [微信小程序canvas]实现小程序手写板用户签名(附代码) 工作中公司业务需要的微信小程序用户签字功能 先看效果图: wxml <view class="wrapper"& ...

  5. 关于星空的java小程序_[Java教程]小程序使用Canvas画饼图_星空网

    小程序使用Canvas画饼图 2018-10-24 0 先上效果图 -------------------------------------------------------------w --- ...

  6. 微信小程序-基于canvas画画涂鸦

    代码地址如下: http://www.demodashi.com/demo/14461.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...

  7. 小程序坑-canvas

    canvas中单位问题 在canvas中绘制的单位都是px,但由于不同屏幕的像素比不同,在小程序中样式我们使用的单位是rpx,所以在canvas中就需要把rpx换成对应的px:由于rpx可以根据屏幕宽 ...

  8. 小程序05 canvas绘图并保存到相册

    小程序现在没有提供直接分享到朋友圈的接口,所以只能采取折中的策略,即先将要分享的内容先保存为图片,保存到用户相册,然后再由用户将该图片分享到朋友圈 生成小程序码需要access token,后端生成比 ...

  9. html2canvas给图片添加水印,小程序用Canvas给图片加水印,拼接图片,制作名片

    Canvas是微信小程序中的一个原生组件,因此我们在使用它的时候要特别注意微信小程序对原生组件的使用说明.canvas这个组件其实就是一个画布,你可以在上面画很多你用其他方式不好实现的内容.下面我就将 ...

  10. 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)

    小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像) 微信小程序生成特色头像,海报等是比较常见的.下面我来介绍下实现该类小程序的过程. 首先选择前端来通过 canvas 绘制.这样比较节 ...

最新文章

  1. 推荐阅读的多核编程技术书籍
  2. Solr 4.x定时、实时增量索引 - 修改、删除和新增索引
  3. 非科班出身获得软开职位
  4. 一个 Java 对象到底有多大?
  5. docker tomcat 多开 实例_给妈妈讲什么是docker
  6. ABAP:向自建表写入数据时,需要注意的问题
  7. 空间谱专题16:信号个数估计
  8. 为什么Docker是云计算必然的现在和未来
  9. 0day的NFO文件名的含义大全
  10. 06 小数据池 is 和 = = 再谈编码
  11. Objective-C中的self和super
  12. Spring bean 不被 GC 的真正原因
  13. js怎么把按钮往下移_Vue.js 实现计算器
  14. 快过年了,来,来,来!给七大姑八大姨好好解释解释【啥是DBA 】
  15. 一元运算符重载 前置和后置++ --(这种一般用成员函数来实现重载)
  16. css实现平角切角和弧形切角效果
  17. vscode 插件导出_VScode插件推荐
  18. linux samba 多个目录,linux7 Samba服务配置,多个部门相应管理自己的项目目录,其他有访问权限...
  19. add in Web.config
  20. display:table与本身的table的区别

热门文章

  1. node.js项目应用
  2. ASP.NET Core 入门教程 2、使用ASP.NET Core MVC框架构建Web应用
  3. Django 2.1.3 中间件使用
  4. HTTP状态码-HTTP Status Code
  5. jQuery方法position()与offset()区别
  6. 创新的缩略图展示javascript类库 - Kort.js
  7. sersync2 完全安装配置说明(三) ----插件基本配置和使用
  8. ftp安装遇到的问题
  9. 使用PowerDesigner导入SQL生成数据表模型
  10. golang switch case语句 简介