簡體   English   中英

無法從畫布獲取圖像數據

[英]Cannot get Image Data from a canvas

以下函數應從存在的畫布上獲取圖像數據(使用context.getImageData() ,其中包含圖像(已加載到網頁上)和第二個未顯示在頁面上的畫布。

如預期的那樣,第一個畫布的數據將“獲得”,並且將彈出alert(data1.data.length) ,並顯示一個合理的數字。 但是,第二個畫布的數據不是“獲取”的,並且該函數在alert(data2.data.length);之前中斷alert(data2.data.length); 線。 那是似乎不能在整個功能中起作用的唯一一行,這是我的問題。

function operateImage(){

    var operand = new Image();
    var data1, data2;
    //exisiting canvas
    var c =document.getElementById("edit_canvas");
    var ctx=c.getContext("2d");

    var operation = document.getElementById("operation").value;

    //make a new temporary canvas and store the input image
    var hiddenCanvas = document.createElement('canvas');
    var hiddenCtx = hiddenCanvas.getContext('2d');
    operand.src = document.getElementById("operation_image").value; 
    hiddenCanvas.width = operand.width;
    hiddenCanvas.height = operand.height;

    hiddenCtx.drawImage(operand,0,0);
    //get image data objects from both canvases
    data1 = ctx.getImageData(0,0,c.width,c.height);
    alert(data1.data.length);
    data2 = hiddenCtx.getImageData(0,0,hiddenCanvas.width,hiddenCanvas.height);
    alert(data2.data.length);

    /*pass the two image data objects to another function for processing*/
}

函數獲取圖像數據后,它將根據操作值將它們傳遞給另一個函數。 (它將AND,OR,XOR或NOT像素數據數組的內容放在一起)

編輯:這是一條錯誤消息,我得到:“ Uncaught SecurityError:無法在'CanvasRenderingContext2D'上執行'getImageData':畫布已被跨域數據污染。”

您的代碼沒有任何問題,但是由於源映像(operand.src)在不同的域上並且不允許跨域操作而失敗。 更具體地說,您不能從繪制了不同原點圖像的畫布上獲取ImageData。

不幸的是,除非您有權訪問源映像所在的服務器,否則就沒有解決方案。 服務器需要這樣設置HTTP標頭:

Access-Control-Allow-Origin: *

並且,在客戶端, 繪制到隱藏的畫布之前 ,您需要允許跨域源:

operand.crossOrigin = 'anonymous';

設置這些值(*和'anonymous')將完全禁用跨域檢查,這可能不是您想要的。 您可以設置與您要使用的特定域匹配的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM