Re: image_filter_jpeg_quality не работает без указания image_filter rotate|resize|crop

Валентин Бартенев ne at vbart.ru
Thu Sep 20 22:40:39 UTC 2012


On Wednesday 19 September 2012 12:39:31 mxs kolo wrote:
[...]
> В аттаче есть патч которым я решил эту проблему для себя.
> Мне пришось добавить новый тип фильтра - quality_only.
> Мой конфиг теперь выглядит так:
>   location ~* \.(jpg|jpeg)$ {
>         image_filter quality_only;
>         image_filter_buffer 10M;
>         image_filter_jpeg_quality 75;
>         image_filter_sharpen 25;
>         root   /var/www/vhosts/some-domain-here.ru/httpdocs/;
>    }

quality_only не очень подходящее название для опции image_filter.

 1. crop | resize | test - глаголы, означающие действие, производимое над
    изображением, а quality_only - нет.

 2. Судя по тому, что делает патч, текущее название просто не соответствует
    действительности: к изображению применяется резкость и убирается
    прозрачность, если заданы соответствующие директивы. Директива же
    image_filter_jpeg_quality работает только для изображений в формате
    jpeg, при этом патч не накладывает никаких ограничений на обработку
    png и gif.

Я предлагаю поменять название на более общее, например, "convert" будет неплохо.

> Я был -бы очень признателен, если-бы кто-то посмотрел патч на предмет
> ошибок.

На будущее, просьба делать diff с опцией -p, так он будет лучше читаться.


> --- nginx-1.3.6/src/http/modules/ngx_http_image_filter_module.c 2012-04-21
> 23:02:21.000000000 +0400 +++
> nginx-1.3.6.PATCHED/src/http/modules/ngx_http_image_filter_module.c
> 2012-09-19 12:32:16.000000000 +0400 @@ -18,6 +18,7 @@
> 
>  #define NGX_HTTP_IMAGE_RESIZE    3
>  #define NGX_HTTP_IMAGE_CROP      4
>  #define NGX_HTTP_IMAGE_ROTATE    5
> 
> +#define NGX_HTTP_IMAGE_QUALITY   6
> 
>  #define NGX_HTTP_IMAGE_START     0
> 
> @@ -507,6 +508,10 @@
> 
>          return ngx_http_image_json(r, rc == NGX_OK ? ctx : NULL);
>      
>      }
> 
> +    if (conf->filter == NGX_HTTP_IMAGE_QUALITY) {
> +      return ngx_http_image_resize(r, ctx);
> +    }
> +

Style. Множество лишних пробелов в конце строк.

>      ctx->angle = ngx_http_image_filter_get_value(r, conf->acv, conf->angle);
>      
>      if (conf->filter == NGX_HTTP_IMAGE_ROTATE) {
> 
> @@ -813,6 +818,10 @@
> 
>          resize = 0;
> 
> +    } else if (conf->filter == NGX_HTTP_IMAGE_QUALITY) {
> +
> +        resize = 0;
> +
>      } else { /* NGX_HTTP_IMAGE_CROP */
>      
>          resize = 0;

Та же проблема с пробелами в пустых строках и на конце.

Лучше вынести resize = 0; выше, за пределы всей конструкции из if - else.
Должно получиться как-то так:

  resize = 0;

  if (conf->filter == NGX_HTTP_IMAGE_RESIZE) {

      ...

  } else if (conf->filter == NGX_HTTP_IMAGE_CROP) {

      ...

  }

--
Валентин Бартенев


Подробная информация о списке рассылки nginx-ru