private function outputImage($query)
 {
     extract(Options::getOptions());
     $queryParam = sprintf('%s-query', $baseUrl);
     $pathParam = sprintf('%s-path', $baseUrl);
     if (empty($query->query[$queryParam]) || empty($query->query[$pathParam])) {
         return;
     }
     $params = $query->query[$queryParam];
     $path = preg_replace('/\\.\\.\\//', '', $query->query[$pathParam]);
     $params = explode('-', $params);
     $parsed = array();
     foreach ($params as $param) {
         if (preg_match("/(?P<operation>[a-z]{1})(?P<value>[\\S]*)/", $param, $matches) && isset(static::$operations[$matches['operation']])) {
             $parsed[static::$operations[$matches['operation']]] = $matches['value'];
         }
     }
     foreach ($parsed as $key => $value) {
         switch ($key) {
             case 'crop':
                 $dimensions = explode('x', $value);
                 $parsed['width'] = intval($dimensions[0]);
                 $parsed['height'] = intval($dimensions[1]);
                 $parsed['cropped'] = true;
                 unset($parsed[$key]);
                 break;
             case 'extension':
                 $path .= '.' . preg_replace('/[^0-9a-zA-Z]*/', '', $value);
                 unset($parsed[$key]);
                 break;
             case 'offset':
                 $dimensions = explode('x', $value);
                 $parsed['offsetX'] = intval($dimensions[0]);
                 $parsed['offsetY'] = intval($dimensions[1]);
                 unset($parsed[$key]);
                 break;
             case 'width':
             case 'height':
                 $parsed[$key] = intval($value);
                 break;
         }
     }
     $image = Resize::getImage($path, $parsed);
     if (is_wp_error($image)) {
         wp_die($image);
     }
     // Set caching headers, and stream
     header('Pragma: public');
     header('Cache-Control: max-age=86400');
     header('Expires: ' . gmdate('D, d M Y H:i:s \\G\\M\\T', time() + 86400));
     $image->stream();
     exit;
 }