2015-08-28 3 views
2

Я пытаюсь вывести значения пикселей из изображения. Изображение загружается правильно; другой ответ здесь предложил, чтобы browswer пытался прочитать пиксели до того, как изображение закончит загрузку, но я вижу, что он загружен к моменту срабатывания alert().getImageData() возвращает все нули

function initContext(canvasID, contextType) 
{ 
    var canvas = document.getElementById(canvasID); 
    var context = canvas.getContext(contextType); 
    return context; 
} 

function loadImage(imageSource, context) 
{ 
    var imageObj = new Image(); 
    imageObj.onload = function() 
    { 
     context.drawImage(imageObj, 0, 0); 
    }; 
    imageObj.src = imageSource; 
    return imageObj; 
} 

function readImage(imageData) 
{ 
    console.log(); 
    console.log(imageData.data[0]); 
} 

var context = initContext('canvas','2d'); 
var imageObj = loadImage('images/color-test.png',context); 
var imageData = context.getImageData(0,0,10,10); 
alert(); 
readImage(imageData); 
+1

«загружается во время предупреждения() срабатывает» не означает «нагруженное время' getImageData() 'называется» –

+0

я переместил предупреждение() к перед getImageData() вызова (Спасибо, Павел!) и теперь это работает. Поэтому мне нужно больше времени на загрузку, я думаю - только принятый ответ [здесь] (http://stackoverflow.com/questions/5694599/getimagedata-always-returning-0) говорит, что для использования этой функции используется функция onload, и это то, что у меня было. Я не уверен, почему он не работает. – zzxjoanw

+1

Вы вызываете 'onload', но не дожидаетесь его запуска. Лучше всего вызывать 'getImageData()' и 'readImage()' * из * обработчика 'onload', чтобы быть уверенным, что это сделано. В противном случае вы обречены после удаления «alert()». –

ответ

3

Image.onload() вызывается асинхронно, когда изображение было загружено. Это может произойти после того, как ваш текущий код вызывает context.getImageData().

Следующий код должен работать:

function initContext(canvasID, contextType) 
{ 
    var canvas = document.getElementById(canvasID); 
    var context = canvas.getContext(contextType); 
    return context; 
} 

function loadImage(imageSource, context) 
{ 
    var imageObj = new Image(); 
    imageObj.onload = function() 
    { 
     context.drawImage(imageObj, 0, 0); 
     var imageData = context.getImageData(0,0,10,10); 
     readImage(imageData); 
    }; 
    imageObj.src = imageSource; 
    return imageObj; 
} 

function readImage(imageData) 
{ 
    console.log(); 
    console.log(imageData.data[0]); 
} 

var context = initContext('canvas','2d'); 
var imageObj = loadImage('images/color-test.png',context); 

Если вы хотите получить доступ к значению imageData вне loadImage(), у вас есть 2 основных варианта:

  1. МАГАЗИНУ imageData в переменной, которая объявлена вне функции. В этом случае значение будет отменено до тех пор, пока не будет вызван ваш onload(), поэтому внешний код должен будет проверить его на разумность перед вызовом readImage(imageData).
  2. Имейте внешний код зарегистрировать функцию обратного вызова, и ваш onload() вызовет эту функцию с помощью значения imageData.
+0

Если я хочу получить доступ к imageData за пределами функции loadImage, что лучший способ сделать это? – zzxjoanw

+0

См. Мой обновленный ответ. – cybersam

0

Возможно также, что вы оцениваете часть прозрачного изображения. У меня была эта проблема при сканировании PNG.

Смежные вопросы