Created
February 23, 2017 03:36
-
-
Save pionize/d2de150a0832595ab703171e9029ad4c to your computer and use it in GitHub Desktop.
Image service
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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