2011-04-17 28 views
7

HTML5 ve Javascript'te iki resmi karşılaştıran bir komut dosyası oluşturmaya çalışıyorum. Ancak bazı garip nedenlerden dolayı, görüntüler her zaman aynıdır.getImageData her zaman dönüyor 0

Ve sorunun ne olabileceğine baktığımızda, her bir pikselin her veri değerinin bazı garip nedenlerden dolayı "0" döndüğünü öğrendim.

Peki, yanlış yaptığım şey hakkında bir fikrin var mı?

Bazı nedenlerden ötürü çok basit bir şeymiş gibi hissediyorum, ama tuval elemanını öğrendim, yani evet. Ben sorunun görüntü verileri muhtemelen Tuval için kullanmayı denediği noktada hazır olmadığını olduğundan şüpheleniyorsanız

function compareImg() { 
    var c1 = document.getElementById("c"); 
    var ctx1 = c1.getContext("2d"); 
    var c2 = document.getElementById("c2"); 
    var ctx2 = c2.getContext("2d"); 

    var match = 0; 

    var img1 = new Image(); 
    img1.src = "cat.jpg"; 
    img1.onload = function() { 
     ctx1.drawImage(img1, 0, 0); 
    } 
    var img2 = new Image(); 
    img2.src = "bird.jpg"; 
    img2.onload = function() { 
     ctx2.drawImage(img2, 0, 0); 
    } 


    for(var x = 0; x<c1.width; x++) { // For each x value 
     for(var y = 0; y<c1.height; y++) { // For each y value 
      var data1 = ctx1.getImageData(x, y, 1, 1); 
      var data2 = ctx2.getImageData(x, y, 1, 1); 
      if (data1.data[0] == data2.data[0] && data1.data[1] == data2.data[1] && data1.data[2] == data2.data[2]) { 
       match++; 
      } 
     } 
    } 
    var pixels = c1.width*c1.height; 
    match = match/pixels*100; 
    document.getElementById("match").innerHTML = match + "%"; 
} 

cevap

5

Karşılaştırma işleminizi gerçekleştirmeden önce resimlerinizin yüklenip çizilmesini beklemezsiniz. Bu deneyin:

var img = new Image; 
img.onload = function(){ 
    ctx1.drawImage(img,0,0); 
    var img = new Image; 
    img.onload = function(){ 
    ctx2.drawImage(img,0,0); 
    // diff them here 
    }; 
    img.src = 'cat.jpg'; 
}; 
img.src = 'cat.jpg'; 

Yukarıda gösterildiği gibi, her zaman set your srcafter your onload gerekir.

+0

" src "ve" onload "atama sırasına dair batıl inancımı eklediğiniz için teşekkürler. :-) Belki de bir batıl inanç değil! – Pointy

+0

@Pointy [Hayır, sadece batıl inanç değildir.] (Http://stackoverflow.com/questions/4776670/should-setting-an-image-src-to-dataurl-be-available-immediately) – Phrogz

+0

Fascinating, @ Phrogz! İnsanların bunu yapmasını söylemek için yıllarca haklı hissettim :-) – Pointy

1

:

Bu

benim kodudur. Eğer onload işleyicileri, yani kendiliğinden gelir (muhtemelen) yardım bu kodu ertelemek durumunda:

var img1 = new Image(), count = 2; 
img1.src = "cat.jpg"; 
img1.onload = function() { 
    ctx1.drawImage(img1, 0, 0); 
    checkReadiness(); 
} 
var img2 = new Image(); 
img2.src = "bird.jpg"; 
img2.onload = function() { 
    ctx2.drawImage(img2, 0, 0); 
    checkReadiness(); 
} 

function checkReadiness() { 
    if (--count !== 0) return; 

    for(var x = 0; x<c1.width; x++) { // For each x value 
    for(var y = 0; y<c1.height; y++) { // For each y value 
     var data1 = ctx1.getImageData(x, y, 1, 1); 
     var data2 = ctx2.getImageData(x, y, 1, 1); 
     if (data1.data[0] == data2.data[0] && data1.data[1] == data2.data[1] && data1.data[2] == data2.data[2]) { 
      match++; 
     } 
    } 
    } 
    var pixels = c1.width*c1.height; 
    match = match/pixels*100; 
    document.getElementById("match").innerHTML = match + "%"; 
} 

Tüm yaptığım Kodunuzdaki etrafında bir işlev sarmalayıcı eklemek oldu. Bu fonksiyon eklediğim görüntü sayımı değişkenini ve sadece sıfır olduğunda (yani, her iki görüntü yüklendikten sonra) çalışmayı kontrol eder.

(Bu olabilir hurafe, ama her zaman önce "onload" işleyicisi atamak ben "src" set özelliği. Ben, belki de sadece geçmişte, tarayıcılar işleyicisi eğer çalıştırmak başarısız olabilir bu fikrin var Görüntü zaten önbellekte.)

Şimdi başka bir şey: muhtemelen görüntü verisini bir kez almalı ve sonra geri verilmiş veriler üzerinde yinelemelisiniz. Her bir piksel için "getImageData()" çağırmak, tarayıcının yapması gereken çok iş olacaktır.

+0

Şimdi, komut dosyasının görüntü verilerini aldığı ilk satırda bir "güvenlik hatası" alıyorum ... Chrome, "SECURITY_ERR: DOM istisnası 18" ve Firefox "Hata: yakalanmamış istisna:" istisna ... "Güvenlik hatası" kodu: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR) ...]" – iamarcel

+1

Görüntüleri başka bir alandan mı getiriyorsunuz? Eğer öyleyse, o zaman bu bir güvenlik hatasıdır. Başka bir etki alanından içerikle yüklenmiş bir