【问题标题】:Why does getImageData give a large array?为什么 getImageData 会给出一个大数组?
【发布时间】:2023-03-28 08:08:01
【问题描述】:

在我的 HTML5 Canvas 中分析像素数据:

    var width  = 960;
    var height = 500;
    var canvas = document.getElementById('myFigure');
    var ctx = canvas.getContext("2d");
    var image = new Image("starry-night.jpg");
    ctx.drawImage(image, 0, 0);
    var pixels = ctx.getImageData(0,0, width, height);

我得到的图像数据数组的长度是1920000,但是当我乘以960*500*3 = 1440000时,我的计算怎么会比实际长度小很多?

谁能给我解释一下Uint8ClampedArray的类型。

【问题讨论】:

    标签: javascript image canvas html5-canvas


    【解决方案1】:

    简答

    1920000 / 960 / 500 = 4 因为数组存储了 Alpha 的第四个值(RGBA 不是 RGB)

    Uint8ClampedArray 表示 (U)nsigned (Int)egers 的数组,它们被钳位(强制具有最高值)(8)字节。 8 个字节的无符号整数允许最多 256 个值 (0-255) 的唯一位组合。 (如果整数是有符号的,你可以有一半的正数和一半的负数)

    长答案

    根据 https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Pixel_manipulation_with_canvas

    data = 表示一维数组的 Uint8ClampedArray 包含 RGBA 顺序的数据,整数值在 0 之间 和 255(包括在内)。

    Uint8ClampedArray 包含高 × 宽 × 4 字节的数据,其中 索引值范围从 0 到 (height×width×4)-1。

    1920000 / 960 / 500 = 4

    根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray

    Uint8ClampedArray 类型数组表示一个 8 位数组 无符号整数限制在 0-255;如果您指定的值是 超出 [0,255] 的范围,将改为设置 0 或 255。这 内容被初始化为0。一旦建立,你可以参考 使用对象的方法或使用标准的数组中的元素 数组索引语法(即使用括号表示法)。

    【讨论】:

      【解决方案2】:

      您会收到 RGB 值和 Alpha 值。这意味着您必须执行960 * 500 * 4 才能产生正确的结果。

      【讨论】:

        猜你喜欢
        • 2019-06-07
        • 1970-01-01
        • 1970-01-01
        • 2019-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-23
        • 2022-06-10
        相关资源
        最近更新 更多