Skip to content

Instantly share code, notes, and snippets.

@likidu
Last active September 26, 2015 13:09
Show Gist options
  • Save likidu/b356ad03b45c06f262de to your computer and use it in GitHub Desktop.
Save likidu/b356ad03b45c06f262de to your computer and use it in GitHub Desktop.

canvas-qr

qrcode creator based on node-canvas and qr-js

important: install Cairo first

install Cairo first, For system-specific installation view the Wiki from node-canvas

features

  • return canvas object, use buffer or stream is your choice
  • 5 layers at most: base background, background color, background image, qrcode, logo image

install

npm i canvas-qr

use

var 
assert = require('assert')
,cq = require('canvas-qr')
,qr = cq.qr
,fs = require('fs')
,toPromiseFunc = function(thunk) {
    return function() {

        //arguments to array
        var $_len = arguments.length
        var args = new Array($_len)
        for(var $_i = 0; $_i < $_len; ++$_i) {
            args[$_i] = arguments[$_i]
        }

        var ctx = this
        return new Promise(function(resolve, reject) {
            args.push(function(err, val){
                if(err) reject(err)
                else resolve(val)
            })
            thunk.apply(ctx, args)
        })
    }
}
,readFile = toPromiseFunc(fs.readFile)
,co = require('co')
,Canvas = cq.Canvas
,Image = Canvas.Image

function* t1() {

    var bgImageFile = yield readFile('test/bg.jpg')
    var bgImage = new Image()
    var logoImageFile = yield readFile('test/q-logo.png')
    var logoImage = new Image()

    var cvs

    bgImage.src = bgImageFile
    logoImage.src = logoImageFile

    cvs = qr({
        baseColor: '#fff' //canvas base color, all other images draw on this base
        ,backgroundImage: bgImage //canvas Image Object as background
        ,backgroundColor: null //background color String, such as 'rgba(255,255,255,.6)' or '#fff'
        ,size: 200 //image size, pix
        ,border: 0.04 // border widrth = size * border
        ,str: 'hello world' //string to encode to qr, must have this, all other params is optional
        ,forgroundColor: '#000' //forgroundColor String
        ,logoImage: logoImage //canvas Image Object as logo
        ,logoWidth: 40
        ,logoHeight: 40
        ,ecc: 'M' //ecc level, [ 'L', 'M', 'Q', 'H' ]
    })

    return new Promise(function(resolve, reject) {
        cvs.toBuffer(function(err, buf) {
            if(err) reject(err)
            else resolve buf
        })
    })

}

//for koa, use stream
app.get('/qr-image', function* (next) {

    var bgImageFile = yield readFile('test/bg.jpg')
    var bgImage = new Image()
    var logoImageFile = yield readFile('test/q-logo.png')
    var logoImage = new Image()

    bgImage.src = bgImageFile
    logoImage.src = logoImageFile

    var stream = qr({
        baseColor: '#fff' //canvas base color, all other images draw on this base
        ,backgroundImage: bgImage //canvas Image Object as background
        ,backgroundColor: null //background color String
        ,size: 200 //image size
        ,border: 0.04 // border widrth = size * border
        ,str: 'haha' //string to encode to qr
        ,forgroundColor: '#000' //forgroundColor
        ,logoImage: logoImage
        ,logoWidth: 40
        ,logoHeight: 40
        ,ecc: 'M'
    }).pngStream

    this.body = stream

})


//for express, use pngData
app.get('/qr-image', function* (req, res) {

    co(t1())
    .then(function(buf) {
        res.end(buf)
    })

})

changelog

  • 0.1.1 change licence to MIT, fix readme dependency
  • 0.0.4 set default ecc level = 'M'
  • 0.0.3 just change readme, nothing else

LICENSE

MIT

gm(request('http://www.some-domain.com/some-image.jpg'), "my-image.jpg")
.resize("100^", "100^")
.stream(function(err, stdout, stderr) {
var data = {
Bucket: "my-bucket",
Key: "my-image.jpg",
Body: stdout
ContentType: mime.lookup("my-image.jpg")
};
s3.client.putObject(data, function(err, res) {
console.log("done");
});
});
});
// https://github.com/koajs/examples/blob/master/stream-file/app.js
var koa = require('koa');
var fs = require('fs');
var app = module.exports = koa();
var path = require('path');
var extname = path.extname;
// try GET /app.js
app.use(function *() {
var path = __dirname + this.path;
var fstat = yield stat(path);
if (fstat.isFile()) {
this.type = extname(path);
this.body = fs.createReadStream(path);
}
});
if (!module.parent) app.listen(3000);
/**
* thunkify stat
*/
function stat(file) {
return function (done) {
fs.stat(file, done);
};
}
var fs = require('fs');
var readFilePromise = function(src) {
return new Promise(function (resolve, reject) {
fs.readFile(src, {'encoding': 'utf8'}, function (err, data) {
if(err) return reject(err);
resolve(data);
});
});
}
app.use(router.get('/', function *(){
this.body = yield readFilePromise(__dirname + '/public/htmlfilename.html');
}));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment