Skip to content

Instantly share code, notes, and snippets.

@pionize
Created February 23, 2017 03:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pionize/d2de150a0832595ab703171e9029ad4c to your computer and use it in GitHub Desktop.
Save pionize/d2de150a0832595ab703171e9029ad4c to your computer and use it in GitHub Desktop.
Image service
'use strict';
const Promise = require('bluebird');
const fs = require('fs');
const crypto = require('crypto');
const gm = require('gm').subClass({imageMagick: true});
var base64 = require('node-base64-image');
const _ = require('lodash');
function ImageServiceService() {
const create = (base64Image, fileName, options) => {
return new Promise((resolve, reject) => {
let remoteImage = Promise.resolve(base64Image);
if (/^https?:\/\//i.test(base64Image)) {
remoteImage = new Promise((resolve, reject) => {
base64.encode(base64Image, {string: true}, (err, result) => {
if (err) reject(err);
if (result) resolve('data:image/jpeg;base64,'+ result);
});
});
}
remoteImage.then((encodedBase64) => {
base64Image = encodedBase64;
const dir = 'public/images';
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
const width = _.get(options, 'width', 300);
const height = _.get(options, 'height', 300);
let imageType = 'jpg';
if (base64Image.indexOf('image/') > -1) {
let mimeType = base64Image.split(';')[0];
imageType = mimeType.split('/')[1];
}
let filePath = dir + '/' + fileName + '.' + imageType;
// add to buffer base64 image
if (base64Image.indexOf('image/') > -1) {
base64Image = base64Image.split(',')[1];
}
let encondedImageBuffer = new Buffer(base64Image, 'base64');
gm(encondedImageBuffer)
.resize(width, null)
.crop(width, height, 0, 0)
.write(filePath, function (err) {
if (err) {
reject(err);
} else {
resolve(fileName + '.' + imageType);
}
});
});
});
};
const resizeImage = (base64Image, fileName, options) => {
return new Promise(function(resolve, reject) {
const dir = 'public/images';
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
const width = _.get(options, 'width', 300);
const height = _.get(options, 'height', 300);
let imageType = 'jpg';
if (base64Image.indexOf('image/') > -1) {
let mimeType = base64Image.split(';')[0];
imageType = mimeType.split('/')[1];
}
let filePath = dir + '/' + fileName + '.' + imageType;
// add to buffer base64 image
if (base64Image.indexOf('image/') > -1) {
base64Image = base64Image.split(',')[1];
}
let encondedImageBuffer = new Buffer(base64Image, 'base64');
gm(encondedImageBuffer)
.resize(width, null)
.write(filePath, function (err) {
if (err) {
reject(err);
} else {
resolve(fileName + '.' + imageType);
}
});
});
};
const saveImage = (image, options) => {
const width = _.get(options, 'width', 300);
const height = _.get(options, 'height', 300);
return new Promise(function(resolve, reject) {
if (!image) {
reject(new Error('Invalid image'));
}
const dir = 'public/images/';
crypto.pseudoRandomBytes(16, (err, raw) => {
const fileName = raw.toString('hex') + '.' + image.mimetype.split('/')[1];
gm(image.buffer)
.resize(width, height)
.crop(width, height, 0, 0)
.write(filePath, function (err) {
if (err) {
reject(err);
} else {
resolve(fileName + '.' + imageType);
}
});
});
});
};
return {
create: create,
saveImage: saveImage,
resizeImage: resizeImage
};
}
module.exports = ImageServiceService();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment