canvas踩坑

  一、图片清晰度

项目用的是淘宝小程序,百度了一大圈,能参考的也就是微信小程序,都是说改变输出图片宽高也就是destWidth,destHeight,如下图:


但经过实测 真的没用 该模糊的还是模糊,然后怒而看原生canvas发现和小程序的文档大差不差,遂作罢,但我们已知等式:原始尺寸 = 样式尺寸 * 像素比倍率

我们知道解决清晰度的关键就是先放大后缩小,由此可得如下操作

先在canvas标签作如下操作

<canvas id="canvas" width="{{canvasWidth * systemInfo.pixelRatio}}" height="{{canvasHeight * systemInfo.pixelRatio}}" style="width: {{canvasWidth}}px;height: {{canvasHeight}}px;"></canvas>

width和height属性是canvas标签的宽高,style内的canvasWidth和canvasHeight才是最后实际展示渲染的宽高,systemInfo.pixelRatio则是通过my.getSystemInfo API获取到的像素比

做完上述操作后,得到如下图渲染所示:红框为实际展示的canvas区域大小,图片只渲染了一部分


所以为了要完整渲染这个canvas区域,我们需要对他进行放大,

let { pixelRatio } = this.data.systemInfo // 获取设备像素比

const ctx = my.createCanvasContext('canvas') // 获取canvas

ctx.scale(pixelRatio, pixelRatio) // 放大canvas

放大之后,会如下图所示


可以看到canvas已经被填满了,实际图片相较于没做操作之前也已经很清晰非常多,与原图保持一致

最后导出图片的时候也记得放大图片宽高

ctx.toTempFilePath({

          x: x,

          y: y,

          width: w * pixelRatio,

          height: h * pixelRatio,

          // destWidth: w * pixelRatio, // 输出图片宽度

          // destHeight: h * pixelRatio, // 输出图片高度

          fileType: 'jpg',

          quality: 1, // 图片的质量,目前仅对 jpg 有效,取值范围为 (0, 1]

          success(res) {

            that.setData({

              apFilePath: res.apFilePath

            })

          },

          fail(error) {

            console.log(error);

          }

        });

自此 canvas图片模糊就结束了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容