UNPKG

merge-img

Version:

Merge multiple images into a single image

187 lines (147 loc) 6.33 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); exports.default = mergeImg; var _isPlainObj = require('is-plain-obj'); var _isPlainObj2 = _interopRequireDefault(_isPlainObj); var _jimp = require('jimp'); var _jimp2 = _interopRequireDefault(_jimp); var _alignImage = require('./utils/alignImage'); var _alignImage2 = _interopRequireDefault(_alignImage); var _calcMargin2 = require('./utils/calcMargin'); var _calcMargin3 = _interopRequireDefault(_calcMargin2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } function mergeImg(images) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$direction = _ref.direction, direction = _ref$direction === undefined ? false : _ref$direction, _ref$color = _ref.color, color = _ref$color === undefined ? 0x00000000 : _ref$color, _ref$align = _ref.align, align = _ref$align === undefined ? 'start' : _ref$align, _ref$offset = _ref.offset, offset = _ref$offset === undefined ? 0 : _ref$offset, margin = _ref.margin; if (!Array.isArray(images)) { throw new TypeError('`images` must be an array that contains images'); } if (images.length < 1) { throw new Error('At least `images` must contain more than one image'); } var processImg = function processImg(img) { if (img instanceof _jimp2.default) { return { img }; } if ((0, _isPlainObj2.default)(img)) { var src = img.src, offsetX = img.offsetX, offsetY = img.offsetY; return (0, _jimp.read)(src).then(function (imgObj) { return { img: imgObj, offsetX, offsetY }; }); } return (0, _jimp.read)(img).then(function (imgObj) { return { img: imgObj }; }); }; return Promise.all(images.map(processImg)).then(function (imgs) { var totalX = 0; var totalY = 0; var imgData = imgs.reduce(function (res, _ref2) { var img = _ref2.img, _ref2$offsetX = _ref2.offsetX, offsetX = _ref2$offsetX === undefined ? 0 : _ref2$offsetX, _ref2$offsetY = _ref2.offsetY, offsetY = _ref2$offsetY === undefined ? 0 : _ref2$offsetY; var _img$bitmap = img.bitmap, width = _img$bitmap.width, height = _img$bitmap.height; res.push({ img, x: totalX + offsetX, y: totalY + offsetY, offsetX, offsetY }); totalX += width + offsetX; totalY += height + offsetY; return res; }, []); var _calcMargin = (0, _calcMargin3.default)(margin), top = _calcMargin.top, right = _calcMargin.right, bottom = _calcMargin.bottom, left = _calcMargin.left; var marginTopBottom = top + bottom; var marginRightLeft = right + left; var totalWidth = direction ? Math.max.apply(Math, _toConsumableArray(imgData.map(function (_ref3) { var width = _ref3.img.bitmap.width, offsetX = _ref3.offsetX; return width + offsetX; }))) : imgData.reduce(function (res, _ref4, index) { var width = _ref4.img.bitmap.width, offsetX = _ref4.offsetX; return res + width + offsetX + Number(index > 0) * offset; }, 0); var totalHeight = direction ? imgData.reduce(function (res, _ref5, index) { var height = _ref5.img.bitmap.height, offsetY = _ref5.offsetY; return res + height + offsetY + Number(index > 0) * offset; }, 0) : Math.max.apply(Math, _toConsumableArray(imgData.map(function (_ref6) { var height = _ref6.img.bitmap.height, offsetY = _ref6.offsetY; return height + offsetY; }))); var baseImage = new _jimp2.default(totalWidth + marginRightLeft, totalHeight + marginTopBottom, color); // Fallback for `Array#entries()` var imgDataEntries = imgData.map(function (data, index) { return [index, data]; }); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = imgDataEntries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var _ref7 = _step.value; var _ref8 = _slicedToArray(_ref7, 2); var index = _ref8[0]; var _ref8$ = _ref8[1]; var img = _ref8$.img; var x = _ref8$.x; var y = _ref8$.y; var offsetX = _ref8$.offsetX; var offsetY = _ref8$.offsetY; var _img$bitmap2 = img.bitmap, width = _img$bitmap2.width, height = _img$bitmap2.height; var _ref9 = direction ? [(0, _alignImage2.default)(totalWidth, width, align) + offsetX, y + index * offset] : [x + index * offset, (0, _alignImage2.default)(totalHeight, height, align) + offsetY], _ref10 = _slicedToArray(_ref9, 2), px = _ref10[0], py = _ref10[1]; baseImage.composite(img, px + left, py + top); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return baseImage; }); } module.exports = exports['default'];