expresser
Version:
A ready to use Node.js web app wrapper, built on top of Express.
102 lines (81 loc) • 4.3 kB
text/coffeescript
# EXPRESSER IMAGING
# --------------------------------------------------------------------------
# Handles and manipulates images on the server using ImageMagick.
# <!--
# @see Settings.imaging
# -->
class Imaging
fs = require "fs"
im = require "imagemagick"
logger = require "./logger.coffee"
path = require "path"
settings = require "./settings.coffee"
# IMAGE METHODS
# --------------------------------------------------------------------------
# Internal method to convert image filetypes. Image will also be resized and scale to the specified
# dimensions (width and height). A callback (err, stdout) can be passed as well.
convert = (source, filetype, options, callback) =>
fs.exists source, (exists) ->
if exists
try
callback = options if typeof options is "function" and not callback?
# Create arguments for the ImageMagick `convert` command.
args = []
args.push source
# Get proper dimensions.
size = options.size
width = options.width if options.width?
height = options.height if options.height?
# Set size based on options.
if not size?
size = ""
if width? and width > 0
size += width
if height? and height > 0
size += "x" + height
# Resize?
if size? and size is ""
args.push "-resize"
args.push size
# Set quality?
if options.quality? and options.quality isnt ""
args.push "-quality"
args.push options.quality
# Add target filename argument.
args.push source.replace(path.extname(source), filetype)
# Try converting the source to the destination filetype trigger the `callback`, if passed.
im.convert args, (err, stdout) -> callback(err, stdout) if callback?
logger.debug "Imaging.convert", source, options
# In case of exception, log it and pass to the `callback`.
catch ex
logger.error "Imaging.convert", ex
callback(ex, false) if callback?
else
# Source file does not exist, so log the warning and trigger
# the `callback` if one was passed.
logger.warn "Imaging.convert", "Abort, source file does not exist.", source
callback("Source file does not exist.", false) if callback?
# Converts the specified image to GIF.
# @param [String] source Path to the source image.
# @param [Object] options Options to be passed to the converter, optional.
# @param [Method] callback Function (err, result) to be called when GIF conversion has finished.
toGif: (source, options, callback) =>
convert source, ".gif", options, callback
# Converts the specified image to JPG.
# @param [String] source Path to the source image.
# @param [Object] options Options to be passed to the converter, optional.
# @param [Method] callback Function (err, result) to be called when JPG conversion has finished.
toJpg: (source, options, callback) =>
convert source, ".jpg", options, callback
# Converts the specified image to PNG.
# @param [String] source Path to the source image.
# @param [Object] options Options to be passed to the converter, optional.
# @param [Method] callback Function (err, result) to be called when PNG conversion has finished.
toPng: (source, options, callback) =>
convert source, ".png", options, callback
# Singleton implementation
# --------------------------------------------------------------------------
Imaging.getInstance = ->
@instance = new Imaging() if not @instance?
return @instance
module.exports = exports = Imaging.getInstance()