1

i'm getting this error:

        ctx.drawImage(avatar, 50, 50 );
            ^

Error: Image given has not completed loading
    at Request.request.get

when trying to do this:

app.get('/test', (req, res) => {
    let Canvas = require('canvas')
        , Image = Canvas.Image
        , canvas = new Canvas(500, 500)
        , ctx = canvas.getContext('2d');

    let request = require('request');
    let avatar = new Image;
    request.get('http://s.4pda.to/pKugVJ7TmgG1Tg5z0SsVLfRCUqTAz2oqz1lz2z2co.jpg', (err, res) => {
        avatar.src = res;
        ctx.drawImage(avatar, 50, 50 );
    });

    ctx.font = '30px Impact';
    ctx.rotate(.1);
    ctx.fillText("Awesome!", 50, 100);
    let te = ctx.measureText('Awesome!');
    ctx.strokeStyle = 'rgba(0,0,0,0.5)';
    ctx.beginPath();

    ctx.stroke();

    res.setHeader('Content-Type', 'image/png');
    canvas.pngStream().pipe(res)
});

i'm using node 8.3.0, node-canvas 1.6.6, mac os x 10.12.6. I have already tried to reinstall and rebuild cairo, jpg/png libs, pixman, node-canvas but it didn't help me.

kRicha
  • 797
  • 9
  • 27

1 Answers1

2

For anyone researching this, see the comment by LinusU on 13 August 2017, here:

https://github.com/Automattic/node-canvas/issues/959

Cribbing from there, he suggests a method such as this to load an image, and wait for its loading:

function loadImage (url) {
  return new Promise((resolve, reject) => {
    const img = new Canvas.Image()

    img.onload = () => resolve(img)
    img.onerror = () => reject(new Error('Failed to load image'))

    request.get(url, (err, res) => {
      if (err) return reject(err)

      img.src = res.body
    })
  })
}

It worked nicely for me.

Malcolm Holmes
  • 441
  • 4
  • 6