账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    canvas的putimagedata后,再用getimagedata获得的rgba色值不对
    48
    0

    canvas的putimagedata后,再用getimagedata获得的rgba色值不对


    let canvas = document.querySelector('#canvas');
    let cxt = canvas.getContext('2d');
    let imageData = cxt.createImageData(2,2);
    for (var i=0;i<imageData.data.length;i+=4){

    imageData.data[i+0]=64;
    imageData.data[i+1]=55;
    imageData.data[i+2]=235;
    imageData.data[i+3]=133;

    }
    cxt.putImageData(imageData,0,0)


    然后再getImageData
    0:63
    1:56
    2:236
    3:133
    …………

    这是在chrome下运行的结果,在firefox下的结果也不一样

    真的是疯了,业务中我需要准确的色值,这样子就完全做不下去了

    有谁知道这是为什么,或者又什么解决办法

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ㎜╰霸㈡ 普通会员 1楼

      在JavaScript中,当你使用canvas库的putImageData()方法将图像数据写入canvas时,然后使用getImageData()方法从canvas中读取该数据并将其转换为rgba色值时,可能会出现一些问题。以下是一些可能导致这种情况的原因和解决方案:

      1. 未正确设置图像数据的宽高比例: 如果你将图像数据写入canvas时未正确设置其宽高比例,可能会导致获取rgba色值时结果不准确。例如,如果你将一个宽度为200像素的图像写入canvas,然后在getImageData()方法中尝试获取宽高比例为100%的rgba色值,那么结果将可能不正确。为了解决这个问题,你需要确保在putImageData()方法中,你传入的宽高比例是正确的。例如,如果你的图像宽度为200像素,你可以这样做:

      ```javascript let canvas = document.getElementById('myCanvas'); let ctx = canvas.getContext('2d');

      let image = new Image(); image.src = 'path/to/image.jpg';

      let width = image.width; let height = image.height; let x = 0; let y = 0;

      // 设置宽高比例 let wRatio = width / height; let hRatio = height / width;

      // 创建rgba色值数组 let rgba = new Array(wRatio * hRatio * 4); rgba[0] = 0; // 红色 rgba[1] = 0; // 绿色 rgba[2] = 0; // 蓝色 rgba[3] = 0; // 青色

      // 将图像数据写入canvas ctx.putImageData(image, x, y, 0, 0, width, height);

      // 获取rgba色值 let rgbaData = ctx.getImageData(0, 0, width, height).data; for (let i = 0; i < rgbaData.length; i += 4) { rgba[i] = rgbaData[i] * wRatio; rgba[i + 1] = rgbaData[i + 1] * hRatio; rgba[i + 2] = rgbaData[i + 2] * wRatio; rgba[i + 3] = rgbaData[i + 3] * hRatio; } ```

      1. 图像数据不完整或缺失: 如果图像数据包含缺失或不完整的部分,可能会导致获取rgba色值时结果不准确。例如,如果你的图像数据只有100x100像素的头部部分,而其他部分为空,那么在getImageData()方法中尝试获取完整的rgba色值时,结果将可能不正确。为了解决这个问题,你需要确保图像数据完整。例如,你可以这样做:

      ```javascript let canvas = document.getElementById('myCanvas'); let ctx = canvas.getContext('2d');

      let image = new Image(); image.src = 'path/to/image.jpg';

      let width = image.width; let height = image.height; let x = 0; let y = 0;

      // 创建rgba色值数组 let rgba = new Array(width * height * 4); rgba[0] = 0; // 红色 rgba[1] = 0; // 绿色 rgba[2] = 0; // 蓝色 rgba[3] = 0; // 青色

      // 将图像数据写入canvas ctx.putImageData(image, x, y, 0, 0, width, height);

      // 获取rgba色值 let rgbaData = ctx.getImageData(0, 0, width, height).data; for (let i = 0; i < rgbaData.length; i += 4) { if (rgbaData[i] > 0) { rgba[i] = rgbaData[i] * wRatio; } } ```

      1. 不正确的数据格式: 如果图像数据格式不正确,例如宽度或高度不是像素,那么在getImageData()方法中尝试获取rgba色值时结果将可能不准确。为了解决这个问题,你需要确保图像数据的格式是正确的。例如,如果你的图像数据是浮点数(如1.5),那么在获取rgba色值时,需要将其转换为像素值,然后在计算 rgba 值时使用像素值。以下是转换浮点数到像素值的示例代码:

      ```javascript let canvas = document.getElementById('myCanvas'); let ctx = canvas.getContext('2d');

      let image = new Image(); image.src = 'path/to/image.jpg';

      let width = image.width; let height = image.height; let x = 0; let y = 0;

      // 创建rgba色值数组 let rgba = new Array(width * height * 4); rgba[0] = 0; // 红色 rgba[1] = 0; // 绿色 rgba[2] = 0; // 蓝色 rgba[3] = 0; // 青色

      // 将图像数据写入canvas ctx.putImageData(image, x, y, 0, 0, width, height);

      // 获取rgba色值 let rgbaData = ctx.getImageData(0, 0, width, height).data; for (let i = 0; i < rgbaData.length; i += 4) { let pixelData = rgbaData[i]; let rgbaValue = (pixelData[0] * wRatio + pixelData[1] * hRatio + pixelData[2] * wRatio + pixelData[3]) / 4; rgba[i] = rgbaValue; } ```

      请根据你的具体需求和图像数据的格式进行相应的调整。注意,以上代码示例假设你的图像数据是以像素为单位的浮点数数组。如果你的数据是以其他格式(如字符串、数组等)构成的,可能需要使用不同的方法进行转换和计算。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部