const fs = require('fs') const PNG = require('pngjs').PNG const Utils = require('./utils') exports.render = function render (qrData, options) { const opts = Utils.getOptions(options) const pngOpts = opts.rendererOpts const size = Utils.getImageWidth(qrData.modules.size, opts) pngOpts.width = size pngOpts.height = size const pngImage = new PNG(pngOpts) Utils.qrToImageData(pngImage.data, qrData, opts) return pngImage } exports.renderToDataURL = function renderToDataURL (qrData, options, cb) { if (typeof cb === 'undefined') { cb = options options = undefined } exports.renderToBuffer(qrData, options, function (err, output) { if (err) cb(err) let url = 'data:image/png;base64,' url += output.toString('base64') cb(null, url) }) } exports.renderToBuffer = function renderToBuffer (qrData, options, cb) { if (typeof cb === 'undefined') { cb = options options = undefined } const png = exports.render(qrData, options) const buffer = [] png.on('error', cb) png.on('data', function (data) { buffer.push(data) }) png.on('end', function () { cb(null, Buffer.concat(buffer)) }) png.pack() } exports.renderToFile = function renderToFile (path, qrData, options, cb) { if (typeof cb === 'undefined') { cb = options options = undefined } let called = false const done = (...args) => { if (called) return called = true cb.apply(null, args) } const stream = fs.createWriteStream(path) stream.on('error', done) stream.on('close', done) exports.renderToFileStream(stream, qrData, options) } exports.renderToFileStream = function renderToFileStream (stream, qrData, options) { const png = exports.render(qrData, options) png.pack().pipe(stream) }