【问题标题】:Javascript imageData returns array of 0'sJavascript imageData 返回 0 的数组
【发布时间】:2015-03-21 18:20:26
【问题描述】:

我正在尝试操作 imageData,但在加载图像并获取其像素数据后,我的 imageData 数组返回全 0。

有一些 html 元素,如滑块和文本框。请忽略那些。

有一个 ImageObject 数据结构,我在其中存储所有图像属性,如 image、pixelData 等..

我首先加载图像,获取其像素数据,然后返回一个回调来存储 ImageObject.imageData。但是在日志 ImageObject.data 中返回全 0。

ImageObject = {};
var MainCtx;
var MainCanvas;
//get the image pixel properties

function start()
{
    //load up the main canvas and ctx 
    MainCanvas = document.getElementById("canvas");
    MainCtx = MainCanvas.getContext('2d');

    //first load up the image and then get its pixel data
    ImageObject.loadImage(function(imageData){
        ImageObject.imageData = imageData;
        ImageObject.data = ImageObject.imageData.data;

        console.log(ImageObject.data); // -> data return all 0's in the array

        for(var i = 0; i < ImageObject.data.length; i += 4) {
            var brightness = 0.34 * ImageObject.data[i] + 0.5 * ImageObject.data[i + 1] + 0.16 * ImageObject.data[i + 2];
          // red
          ImageObject.data[i] = brightness;
          // green
          ImageObject.data[i + 1] = brightness;
          // blue
          ImageObject.data[i + 2] = brightness;
      }

      ImageObject.ctx.putImageData(ImageObject.imageData,ImageObject.image.width,ImageObject.image.height);
  });
}

ImageObject.loadImage = function(callback)
{
    ImageObject.image = new Image();
    ImageObject.image.src = 'http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg';
    ImageObject.image.addEventListener('load',function()
    {
        MainCtx.drawImage(ImageObject.image,0,0);
        callback(ImageObject.getImageData(ImageObject.image));
    });
}

ImageObject.getImageData = function(img)
{
    this.canvas = getCanvas(img.width,img.height);
    this.ctx = this.canvas.getContext('2d');
    return this.ctx.getImageData(0,0,this.canvas.width,this.canvas.height);
}

function getCanvas(w,h)
{
    var c = document.createElement('canvas');
    c.width = w;
    c.height = h;
    return c;
}

start();

我已经分享了下面的 jsFiddle 链接

jsFiddle

有人可以看看我做错了什么吗?

【问题讨论】:

标签: javascript html pixel-manipulation


【解决方案1】:

您的问题是您正在从 getCanvas 函数中创建的新画布中获取图像数据。您需要在现有画布上运行getImageData

这是console.log的更新

console.log(MainCtx.getImageData(0, 0, MainCanvas.width, MainCanvas.height));

这仍然无法立即工作,因为您正在从不同的来源加载图像,因此请确保首先在本地托管图像。

【讨论】:

    【解决方案2】:

    尝试通过缓冲区将信息放入一个 32 位无符号整数数组中。

    有点像

    var img = canvas.getImageData(),
    data32 = new Uint32Array(img.data.buffer);
    
    //loop through the pixels
    for(var i=0; i<data32.length, i++){
    var pixel = data32[i];
    
    //get the colors
    var r = (pixel) & 0xff,
    g = (pixel >> 8) & 0xff,
    b = (pixel >> 16) & 0xff;
    a = (pixel >> 24) & 0xff;
    
    //put the pixels back in (no change)
    data32[i] = (a << 24)
    | (b << 16)
    | (g << 8)
    | r;
    }
    

    作者:马特·洛克耶

    检索自:http://mattlockyer.github.io/iat455/workshop-1.html

    【讨论】:

      【解决方案3】:

      快速回答是:

      您尝试从新的(空)画布中获取图像数据。

      解释:

      在您的函数getImageData 中,您使用一个名为getCanvas 的函数设置您的画布。 在这个函数中,你创建一个新的画布(document.createElement('canvas');

      既然你已经将你的画布设置为MainCanvas,你应该像这样在你的函数getImageData中使用它:

      this.canvas = MainCanvas;

      不幸的是,由于Cross-Origin Resource Sharing policy,我无法让它在你的 jsfiddle 中工作。

      【讨论】:

      • 并且getCanvas中的width和height属性不应更改,因为它将重置MainCanvas
      猜你喜欢
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 2018-04-03
      相关资源
      最近更新 更多