2017-04-26 3 views
0

ウェブページに表示された画像をループして、どれが左上のピクセルが白かを判断しようとしています。ウェブページから白い背景を持つ画像を特定する

 $('img').each(function(){ 

     // create an image object using the current image SRC 
     var image = new Image(); 
     image.crossOrigin = "Anonymous"; 
     image.src = $(this).attr('src'); 

     //create a canvas and place the image inside the canvas element 
     var canvas = document.createElement('canvas'); 
     canvas.width = image.width; 
     canvas.height = image.height; 
     canvas.getContext('2d').drawImage(image, 0, 0, image.width, image.height); 

     //grab pixel data 
     var pixel = canvas.getContext('2d').getImageData(0, 0, 1, 1).data; 
     $(this).attr('data-pixel', pixel); 

     //remove canvas 
     $('canvas').remove(); 

    }); 

問題は、これは今のところ常に問題になっています。私はそれを単一のイメージ上で走らせるとほとんどの場合動作します。しかし、すべての画像を見ると、data-pixel="0,0,0,0"></img>が得られます。

私に何か不足していますか?これまでにこの方法を試したことはありませんでした。別のバージョンが分かっている場合は、教えてください。 I上記のコメントに基づいて

+0

1)適切なCORSヘッダーですべての外部イメージが送信されていますか? 2) 'getImageData()。data'は常に(r、g、b、aの)配列を返します。したがって、 'data-pixel'属性に配列を代入しています。あなたはそれについて確かですか? – devnull69

+0

はい、あなたはいくつか欠けています:devnull69が正しく述べたように、あなたのイメージが適切なCORSヘッダーで提供されない場合、イメージは読み込まれません。しかし、#1の問題を修正すればおそらく気づいただろう。画像の読み込みは、キャッシュされていても、非同期であっても、どこからでも、いつでも非同期である。だからあなたが 'drawImage'を呼び出す時に、イメージはまだロードされておらず、あなたのキャンバスには何も描画されません(' 0,0,0,0'は透明ピクセルであり、白いピクセルではありません '[255,255,255 、255])。もちろん、画像がロードされたときにのみ、他のすべてを呼び出す必要があります。 – Kaiido

+0

イメージは実行時にロードされます。私はコンソールを介してそれをロードし、私はヒットし、逃す。ときどき私には正しい値が与えられ、それ以外のときは単に0,0,0,0がすべてに追加されます。これは私の問題です。 –

答えて

0

は、キャンバスの作成や画像がそうようにオンロード描画トリガするためにコードを変更:

$('img').each(function() { 

    var $that = $(this); 
    var image = new Image(); 
    var canvas = document.createElement('canvas'); 
    var imageSource = $that.attr('src'); 
    image.crossOrigin = 'Anonymous'; 
    image.src = imageSource; 
    image.onload = function() { 

     canvas.width = image.width; 
     canvas.height = image.height; 
     canvas.getContext('2d').drawImage(image, 0, 0, image.width, image.height); 
     //grab pixel data 
     var pixel = canvas.getContext('2d').getImageData(0, 0, 1, 1).data; 
     $that.attr('data-pixel', pixel.toString()); 

     if (parseInt(pixel[0]) > 250 && parseInt(pixel[1]) > 250 && parseInt(pixel[2]) > 250) { 

      $that.addClass('white'); 
      $that.closest('table').prepend('<h5>White Background</h5>'); 

     } 
     //remove canvas 
     console.log(pixel.toString()); 
     $('canvas').remove(); 

    }; 

})。

関連する問題