code: function(path, callback) {
        // Identify the file type, size, etc. Stuff them into context.info and
        // context.extension
  
        var result = {};
  
        return async.series({
          imagecrunch: function(callback) {
            var args = [ '-info', path ];
            var proc = childProcess.spawn('imagecrunch', args);
            var output = '';
            proc.stdout.on('data', function(data) {
              output += data.toString();
            });
            proc.on('close', function(code) {
              if (code !== 0) {
                return callback(code);
              } else {
                result = JSON.parse(output);
                if (!result) {
                  return callback('malformed output from imagecrunch');
                }
                return callback(null);
              }
            });
          }
        }, function(err) {
          return callback(err, result);
        });
      }
docs: Identify a local image file.
  
  If the file is not an image or is too defective to be identified an error is
  passed to the callback.
  
  Otherwise the second argument to the callback is guaranteed to have extension,
  width, height, orientation, originalWidth and originalHeight properties.
  extension will be gif, jpg or png and is detected from the file's true contents,
  not the original file extension. Orientation is the string "Undefined" if
  the file does not specify it or is not a JPEG.
  
  Any other properties returned are dependent on the version of ImageMagick used
  and are not guaranteed.
  
  @param {String} path Local filesystem path to image file
  @param {Function} callback Receives the usual err argument, followed by an
  object with extension, width, height, orientation, originalWidth and
  originalHeight properties. Any other properties are not guaranteed.
  
  @see Uploadfs#copyImageIn