Source: apc-static/lib/image/text2image.js

/**
 * Create a image from text.
 * @function lib.image.text2image
 * @param {string} text - Source text.
 * @param {string} filename - Image file name.
 * @param {object} options - Optional settings.
 * @param {number} options.width - Image width.
 * @param {number} options.height - Image height.
 * @param {string} options.color - Text color.
 * @param {string} [options.backgroundColor] - Image background color.
 * @param {string} [options.fontFamily] - Text font family.
 * @param {string} [options.fontFile] - Custom font file.
 * @param {number} [options.cornerRadius] - Corner radius size.
 * @param {function} callback - Callback when done.
 * @author Taka Okunishi
 *
 */
var path = require('path'),
    fs = require('fs'),
    object = require('../../lib/object'),
    deepCopy = object.deepCopy;

exports = module.exports = function (text, filename, options, callback) {
    try {
        require.resolve('fabric');
    } catch (e) {
        var msg = 'npm module "fabric" not found. Please try: \n\n\t$ npm install fabric \n\n If you got some error, ' +
            'Try node-canvas install guild listed here \n \thttps://github.com/LearnBoost/node-canvas/wiki/_pages \n';
        callback(new Error(msg));
        return;
    }
    var fabric = require('fabric').fabric;
    var settings = deepCopy(options, {
        width: 100,
        height: 200,
        fontSize: 24,
        color: '#DDD',
        backgroundColor: '#FFF',
        fontFamily: 'Hoefler Text',
        cornerRadius: 0,
        borderWidth: 0
    });


    var width = settings.width,
        height = settings.height;


    var canvas = fabric.createCanvasForNode(width, height);


    if (options.fontFile) {
        var fontFile = path.resolve(options.fontFile),
            fontName = path.basename(fontFile, path.extname(fontFile));

        if (canvas.Font) {
            try {
                var font = new canvas.Font(fontName, fontFile);
                canvas.contextContainer.addFont(font);
                settings.fontFamily = fontName;
            } catch (e) {
                console.error('Failed to load file:', fontFile);
                console.error(e.stack);
            }
        } else {
            console.warn('Custom font not supported!');
        }
    }


    var borderWidth = settings.borderWidth;
    canvas.add(
        new fabric.Rect({
            width: settings.width - borderWidth * 2,
            height: settings.height - borderWidth * 2,
            rx: settings.cornerRadius,
            ry: settings.cornerRadius,
            fill: settings.backgroundColor,
            originX: 'center',
            originY: 'center',
            left: width / 2,
            top: height / 2,
            borderColor: '#3AF',
            hasBorders: true,
            stroke: settings.borderColor,
            strokeWidth: borderWidth
        })
    );
    canvas.add(
        new fabric.Text(text, {
            fontFamily: settings.fontFamily,
            fontSize: settings.fontSize,
            fill: settings.color,
            originX: 'center',
            originY: 'center',
            left: width / 2,
            top: height / 2,
            lineHeight: 1
        })
    );
    var inStream = canvas.createPNGStream(),
        outStream = fs.createWriteStream(filename);

    inStream.on('data', function (chunk) {
        outStream.write(chunk);
    });
    inStream.on('error', function (err) {
        callback && callback(err);
        callback = null;
    });
    inStream.on('end', function () {
        callback && callback();
    });
};