2013-04-12 65 views
0

我試圖按照此示例加載灰度圖像http://www.html5canvastutorials.com/advanced/html5-canvas-grayscale-image-colors-tutorial/。由於我的舞臺有許多其他的對象,我試圖用follwing腳本:Kinetic JS - 加載GrayScale圖像

var dImage1 = new Kinetic.Image({ 
       drawFunc: function (canvas) { 
        var context2 = canvas.getContext(); 
        var x = 0; 
        var y = 0; 
        context2.drawImage(imageObj, x, y); 
        var imageData = context2.getImageData(x, y, imageObj.width, imageObj.height); 
        var data = imageData.data; 

        for (var i = 0; i < data.length; i += 4) { 
         var brightness = 0.34 * data[i] + 0.5 * data[i + 1] + 0.16 * data[i + 2]; 
         data[i] = brightness; 
         data[i + 1] = brightness; 
         data[i + 2] = brightness; 
        } 
        context2.putImageData(imageData, x, y); 
       } 
      }); 
      layer1.add(dImage1); 
      stage.add(layer1); 

      var imageObj = new Image(); 
      imageObj.onload = function() { 
       drawImage(this); 
      }; 
      imageObj.src = .....; 

我得到這個錯誤:TypeMismatchError。我會很感激你的建議,在此先感謝。

回答

0

我看到一對夫婦陷阱的在你的代碼...

首先,儘管該規範說,這是可選的,你需要指定上下文模式(「2D」)

// must specify "2d" 

var context2 = canvas.getContext("2d"); 

二,你需要你的Kinetic.Image

所以把Kinetic.Image創建一個函數並調用它imageObj.onload使用它之前完全加載圖像:

function makeKineticImage(){ 

    var dImage1 = new Kinetic.Image({ 
     drawFunc: function (canvas) { 
      var context2 = canvas.getContext("2d"); 
      var x = 0; 
      var y = 0; 
      context2.drawImage(imageObj, x, y); 
      var imageData = context2.getImageData(x, y, imageObj.width, imageObj.height); 
      var data = imageData.data; 

      for (var i = 0; i < data.length; i += 4) { 
       var brightness = 0.34 * data[i] + 0.5 * data[i + 1] + 0.16 * data[i + 2]; 
       data[i] = brightness; 
       data[i + 1] = brightness; 
       data[i + 2] = brightness; 
      } 
      context2.putImageData(imageData, x, y); 
     } 
    }); 
    layer1.add(dImage1); 
} 

stage.add(layer1); 

// you must create your Kinetic.Image AFTER your image is loaded 

var imageObj = new Image(); 
imageObj.onload = function() { 
    makeKineticImage(); 
}; 
imageObj.src = .....; 
+0

非常感謝Mark,它的效果很好。 – hncl

+0

馬克,我可以更改此行中的圖像寬度和高度: context2.getImageData(x,y,dicom1.width,dicom1.height);爲 context2.getImageData(x,y,512,512);我試過但沒有工作。另外我怎麼能補充偏移值?非常感謝你的幫助。 – hncl

+0

當然。 getImageData只是獲得從任何X/Y開始的矩形像素塊。因此,您可以通過getImageData(myOffsetX,myOffsetY,512,512)獲得您想要的任何偏移X/Y的512x512平方塊像素。如果出現錯誤,請確保您沒有請求超出畫布邊緣的像素......因此,如果您的畫布是1000x1000,並且您確實獲取了ImageIdData(700,700,512,512),則會出現錯誤。 – markE