收藏
回答

canvas 绘制图片部分分辨率有问题?

canvas批量绘制图片的时候 部分分辨率下绘制有问题

上面三张为原图分辨率 图1 图2 一起上传时候 分辨率是对的 但是内容都是图2的 如下

但是如果单传或者 传 图2 图3就不会出现这样的问题 按照查询的方法清空 画布也没有效果

下面是部分代码

<canvas  style="width:{{canvasWidth}}px;height:{{canvasHeight}}px;position:fixed;left:100%;id="picCanvastype="2d"></canvas>

 

压缩图片代码

compressImg(imageList) {

      let _this = this;

      return Promise.all(imageList.map((file, index) => {

        return new Promise((resolve, reject) => {

          //获取原图片信息 canvas压缩实现

          wx.getImageInfo({

            src: file.src || file.path,

            success: function (res) {

              let canvasRatio = 1.1;

              let picWidth = res.width //图片原始宽高

              let picHeight = res.height

              if (file.size < 200 * 1024) {

                // 图片小于200k就不压缩

                resolve({

                  ...file,

                  src: res.path,

                  picWidth: picWidth,

                  picHeight: picHeight

                });

              } else {

                while (picWidth > 600 || picHeight > 600) { // 保证宽高在600以内(这里可以自行配置)

                  picWidth = Math.trunc(res.width / canvasRatio)

                  picHeight = Math.trunc(res.height / canvasRatio)

                  canvasRatio = canvasRatio + 0.1;

                }

                const query = _this.createSelectorQuery()

                query.select('#picCanvas').fields({

                  node: true,

                  size: true

                }).exec((ref) => {

                  try {

                    const canvas = ref[0].node

                    const ctx = canvas.getContext('2d')

                    let dpr = wx.getSystemInfoSync().pixelRatio

                    //这里是设置css样式的宽高。

                    //属性宽高是css样式宽高的dpr倍,兼容不同机型,避免绘制的内容模糊。

                    _this.setData({

                      canvasWidth: picWidth / dpr,

                      canvasHeight: picHeight / dpr

                    })

                    canvas.width = picWidth

                    canvas.height = picHeight

                    const img = canvas.createImage()

                    img.src = res.path

                    img.onload = () => {

                      ctx.drawImage(img, 0, 0, picWidth, picHeight); //先画出图片

                      //延迟600ms,避免部分机型未绘制出图片内容就执行保存操作,导致最终的图片是块白色画板。

                      setTimeout(() => {

                        wx.canvasToTempFilePath({

                          fileType: "jpg",

                          canvas: canvas,

                          destWidth: picWidth,

                          destHeight: picHeight,

                          success: function (res) {

                            resolve({

                              ...file,

                              src: res.tempFilePath,

                              picWidth: picWidth,

                              picHeight: picHeight

                            });

                          }

                        }, _this)

                      }, 600)

                    }

                  } catch (e) {

                    //异常后的操作

                    console.log(e)

                  }

                })

              }

            }

          })

        })

      }));

    }

求大佬指点或者提供点思路 感谢

回答关注问题邀请回答
收藏

3 个回答

  • Demons
    Demons
    03-24

    请具体描述问题出现的流程,并提供能复现问题的简单代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)。

    03-24
    有用
    回复 1
    • Passerby A
      Passerby A
      03-24
      想要实现一个批量图片上传 压缩 并且支持拖拽的功能  但是图片压缩完成之后 通过canvas 绘制的时候 原本应该绘制前面图片的画布 绘制成了后面的图片 有时候还会出现覆盖叠加的情况
      图片分辨率区别大的话 会太容易复现这个问题  分辨率接近的话不会出现这个问题
      03-24
      回复
  • 喜感
    喜感
    12-11

    你好,请问问题解决了吗,我目前也遇到这个问题

    12-11
    有用
    回复
  • Passerby A
    Passerby A
    03-24

    关键部分代码片段

    https://developers.weixin.qq.com/s/nte1ZWmr7PPo

    03-24
    有用
    回复
登录 后发表内容