W***@163.com
W***@163.com
  • 发布:2023-06-14 18:25
  • 更新:2023-06-15 10:29
  • 阅读:233

canvasGetImageData获取的data长度为0

分类:uni-app
<template>  
  <view>  
    <image src="https://img0.baidu.com/it/u=1036643107,1728037774&fm=253&fmt=auto&app=138&f=JPEG?w=651&h=433" mode="widthFix" @tap="mounted"></image>  
    <view class="color-block" :style="{ backgroundColor: mainColor }"></view>  
    <canvas canvas-id="color-canvas" style="height: 2000px;width: 750px;"></canvas>  
  </view>  
</template>  

<script>  
export default {  
  data() {  
    return {  
      mainColor: ''  
    }  
  },  
  methods: {  
    getImageColor(url) {  
      return new Promise((resolve, reject) => {  
        uni.getImageInfo({  
          src: url,  
          success: (res) => {  
            // 使用 canvas 获取图片主色调  
            var canvas = uni.createCanvasContext('color-canvas')  
            canvas.drawImage(res.path, 0, 0, res.width, res.height)  
            console.log(res)  

            canvas.draw(false, function() {  
              setTimeout(function(){  

                  uni.canvasGetImageData({  
                    canvasId: 'color-canvas',  
                    x: 0,  
                    y: 0,  
                    width: 100,  
                    height: 100,  
                    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  
                    }  
                  })  
                  // uni.canvasGetImageData({  
                  //   canvasId: 'color-canvas',  
                  //   x: 0,  
                  //   y: 0,  
                  //   width: 20,  
                  //   height: 30,  
                  //   success: function(res) {  
                  //                    console.log(res);  
                  //     if (res.data.length === 0) { // 判断数据是否为空  
                  //       reject(new Error('获取图片数据失败,请检查图片是否正确或重新加载页面'))  
                  //       return  
                  //     }  
                  //     var color = getColor(res.data, res.width, res.height)  
                  //     resolve(hexToRgb(color)) // 将最终的颜色结果返回  
                  //   },  
                  //   fail: function(err) {  
                  //     reject(err) // 将错误信息返回  
                  //   }  
                  // })  
              },2000)  
            })  
          },  
          fail: (err) => {  
            reject(err)  
          }  
        })  
      })  
    },  
    async mounted() {  
      try {  
        const mainColor = await this.getImageColor('https://img0.baidu.com/it/u=1036643107,1728037774&fm=253&fmt=auto&app=138&f=JPEG?w=651&h=433')  
        this.mainColor = mainColor  
      } catch (err) {  
        console.error(err)  
        // 失败时给出友好的提示信息  
        uni.showToast({  
          title: '获取图片主色调失败,请刷新页面重新尝试',  
          icon: 'none',  
          duration: 3000  
        })  
      }  
    }  
    // ... getColor 和 hexToRgb 函数  
  }  
}  

// 获取图片主色调  
function getColor(data, width, height) {  
  var colorMap = {},  
    maxRGB = 0,  
    mainColor = ''  
  for (var i = 0; i < data.length; i += 4) {  
    var r = data[i],  
      g = data[i + 1],  
      b = data[i + 2]  
    if (r === 0 && g === 0 && b === 0) { // 排除黑色的像素点,部分图片黑色像素点可能过多,导致检测到黑色而无法获取主题色  
      continue  
    }  
    var key = r + ',' + g + ',' + b  
    colorMap[key] = (colorMap[key] || 0) + 1  
    if (colorMap[key] > maxRGB) {  
      maxRGB = colorMap[key]  
      mainColor = key  
    }  
  }  
  return mainColor  
}  

// 将 hex 颜色值转换为 RGB 格式  
function hexToRgb(color) {  
  var arr = color.split(',')  
  return 'rgb(' + arr[0] + ',' + arr[1] + ',' + arr[2] + ')'  
}  
</script>  

<style>  
.color-block {  
  width: 100rpx;  
  height: 100rpx;  
  margin-top: 20rpx;  
}  
</style>

返回data为空,不知道是什么原因

2023-06-14 18:25 负责人:无 分享
已邀请:
W***@163.com

W***@163.com (作者)

求回复,求解答

要回复问题请先登录注册