исключение при попытке отрисовки изображений через canvas

#javascript #html #canvas

#javascript #HTML #холст

Вопрос:

Я пытаюсь нарисовать изображения, которые я извлек из Flickr, через canvas, и это фрагмент моих кодов.

 for(var i=0;i<document.getElementsByClassName("canvas").length;  i)
            {
                //randomly select one photo
                var picinfo = photos[Math.floor(Math.random()*photos.length)];
                var img = new Image(); 
                //get the pic URL
                img.src = "http://farm"   picinfo.farm   ".static.flickr.com/"
                  picinfo.server   "/"   picinfo.id   "_"   picinfo.secret   "_m.jpg";

                var ctx = document.getElementsByClassName("canvas")[i].getContext('2d');

                console.log(img);

                // Draw slice
                ctx.drawImage(img, 10, 10);
                // Draw frame
                //ctx.drawImage(document.getElementById('frame'),132,150);
            }
  

это работает до фактического рисования изображений

 ctx.drawImage(img, 10, 10);
  

и это выдает исключение, о котором я понятия не имею.

 uncaught exception: [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIDOMCanvasRenderingContext2D.drawImage]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://localhost:8080/static/js/Gallery.js :: anonymous :: line 25" data: no]
  

Я думаю, что нет ничего плохого в выборке изображений, поскольку я могу видеть выбранные изображения в моем Firebug, например

 <img src="http://farm6.static.flickr.com/5226/5624531777_4a05934fc1_m.jpg">
  

и помогает? заранее благодарю вас.

Ответ №1:

Из-за вашей ограниченной информации сложно что-либо протестировать для вас или повторить вашу ошибку, но я думаю, что могу помочь.

NS_ERROR_NOT_AVAILABLE вероятно, это из-за попытки выполнить слишком много вызовов слишком быстро, но я не совсем уверен.

Даже если это не так, мы можем серьезно попытаться устранить эту проблему, немного изменив ваш код. Вместо быстрого просмотра каждого изображения, мы возьмем одно изображение, подождем его загрузки, нарисуем это изображение, затем перейдем к следующему.

Я изменил ваш приведенный ниже код, но не тестировал его — вам придется это сделать! — поскольку у меня нет всех фрагментов, которые вы делаете.

Это не обязательно оптимальный способ сделать это, но, как написано, он должен работать

 function drawOne(i) {
  //randomly select one photo
  var picinfo = photos[Math.floor(Math.random()*photos.length)];
  var img = new Image(); 
  //get the pic URL
  img.src = "http://farm"   picinfo.farm   ".static.flickr.com/"
    picinfo.server   "/"   picinfo.id   "_"   picinfo.secret   "_m.jpg";

  // When the image is done loading this will execute
  img.onload = function() {
    var ctx = document.getElementsByClassName("canvas")[i].getContext('2d');

    console.log(img);

    // Draw slice
    ctx.drawImage(img, 10, 10);
    // Draw frame
    //ctx.drawImage(document.getElementById('frame'),132,150);

    // we're done with this image? call drawOne again!
    // We may have to wait for a second here... but maybe not.
    i  ;
    if (i !== document.getElementsByClassName("canvas").length) {
      drawOne(i);
    }
  }
}

// Get things started
drawOne(0);
  

Комментарии:

1. Он работает, я думаю, он просто не может обрабатывать столько загрузок за короткое время. Большое вам спасибо