ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

watermark patch


  • To: nginx-ru@xxxxxxxxx
  • Subject: watermark patch
  • From: "Trurl" <nginx-forum@xxxxxxxx>
  • Date: Wed, 06 Feb 2013 06:17:31 -0500
  • Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tigger.jlkhosting.com; s=x; h=Date:Sender:From:Message-ID:Content-Transfer-Encoding:Content-Type:Subject:To; bh=5PXWlpajWujU72q13PHcXAr2n7AscTYqm39chzxr9hc=; b=tIH+V9JHkAsH9yZj6PudSbTrFLW6brzL/c4GlgnXLJo25iX8CNyhzt+RRwJBUGCQ6m/g+C8A5OUuUVNdRrrtdDyEV27sx0r2ZWg2GnhZAay1HrZ6Hhzd3DnRTrZ/wTkA;

откопал старый патч watermark patch by Vadym Zakovinko
причесал, добавил проверок, убрал memory leaking (надеюсь), переделал с JPG
на PNG, добавил полноценную работу с альфаканалом. Работает с версией
1.2.6.

пример использования
        location /images/ {
                image_filter_buffer 10M;
                image_filter_watermark "/srv/www/htdocs/images/swtor.png";
                image_filter_watermark_position top-right; #
top-left|top-right|bottom-right|bottom-left
                image_filter watermark;
                expires -1;
        }
 
сам патч:

--- src/http/modules/ngx_http_image_filter_module.c
+++ src/http/modules/ngx_http_image_filter_module.c
@@ -2,6 +2,7 @@
 /*
  * Copyright (C) Igor Sysoev
  * Copyright (C) Nginx, Inc.
+ * watermark patch: Vadym Zakovinko <vp.zakovinko@xxxxxxxxx> updated by
Trurl McByte <trurl@xxxxxxxxxx>
  */


@@ -18,6 +19,7 @@
 #define NGX_HTTP_IMAGE_RESIZE    3
 #define NGX_HTTP_IMAGE_CROP      4
 #define NGX_HTTP_IMAGE_ROTATE    5
+#define NGX_HTTP_IMAGE_WATERMARK 6


 #define NGX_HTTP_IMAGE_START     0
@@ -46,6 +48,9 @@

     ngx_flag_t                   transparency;

+    ngx_str_t                    watermark;
+    ngx_str_t                    watermark_position;
+
     ngx_http_complex_value_t    *wcv;
     ngx_http_complex_value_t    *hcv;
     ngx_http_complex_value_t    *acv;
@@ -150,6 +155,20 @@
       offsetof(ngx_http_image_filter_conf_t, buffer_size),
       NULL },

+    { ngx_string("image_filter_watermark"),
+     
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_str_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_image_filter_conf_t, watermark),
+      NULL },
+
+    { ngx_string("image_filter_watermark_position"),
+     
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_str_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_image_filter_conf_t, watermark_position),
+      NULL },
+
       ngx_null_command
 };

@@ -518,6 +537,15 @@
         return ngx_http_image_resize(r, ctx);
     }

+    if (conf->filter == NGX_HTTP_IMAGE_WATERMARK) {
+
+        if (!conf->watermark.data) {
+            return NULL;
+        }
+
+        return ngx_http_image_resize(r, ctx);
+    }
+
     ctx->max_width = ngx_http_image_filter_get_value(r, conf->wcv,
conf->width);
     if (ctx->max_width == 0) {
         return NULL;
@@ -813,6 +841,10 @@

         resize = 0;

+    } else if (conf->filter == NGX_HTTP_IMAGE_WATERMARK) {
+
+        resize = 0;
+
     } else { /* NGX_HTTP_IMAGE_CROP */

         resize = 0;
@@ -958,6 +990,40 @@
         gdImageColorTransparent(dst, gdImageColorExact(dst, red, green,
blue));
     }

+    if (conf->filter == NGX_HTTP_IMAGE_WATERMARK && conf->watermark.data)
{
+        FILE *watermark_file = fopen((const char *)conf->watermark.data,
"r");
+        if (watermark_file) {
+            gdImagePtr watermark, watermark_mix;
+            ngx_int_t wdx = 0, wdy = 0;
+
+            watermark = gdImageCreateFromPng(watermark_file);
+
+            if(watermark != NULL) {
+              watermark_mix = gdImageCreateTrueColor(watermark->sx,
watermark->sy);
+              if (ngx_strcmp(conf->watermark_position.data,
+                           "bottom-right") == 0) {
+                wdx = dx - watermark->sx - 10;
+                wdy = dy - watermark->sy - 10;
+              } else if (ngx_strcmp(conf->watermark_position.data,
"top-left") == 0) {
+                wdx = wdy = 10;
+              } else if (ngx_strcmp(conf->watermark_position.data,
"top-right") == 0) {
+                wdx = dx - watermark->sx - 10;
+                wdy = 10;
+              } else if (ngx_strcmp(conf->watermark_position.data,
"bottom-left") == 0) {
+                wdx = 10;
+                wdy = dy - watermark->sy - 10;
+              }
+              gdImageCopy(watermark_mix, dst, 0, 0, wdx, wdy,
watermark->sx, watermark->sy);
+              gdImageCopy(watermark_mix, watermark, 0, 0, 0, 0,
watermark->sx, watermark->sy);
+              gdImageCopyMerge(dst, watermark_mix, wdx, wdy, 0, 0,
watermark->sx, watermark->sy, 75);
+              gdFree(watermark);
+              gdFree(watermark_mix);
+            } else { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"watermark file '%s' is not PNG", conf->watermark.data);}
+        } else {
+            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "watermark
file '%s' not found", conf->watermark.data);
+        }
+    }
+
     sharpen = ngx_http_image_filter_get_value(r, conf->shcv,
conf->sharpen);
     if (sharpen > 0) {
         gdImageSharpen(dst, sharpen);
@@ -1223,6 +1289,11 @@
     ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size,
                               1 * 1024 * 1024);

+    ngx_conf_merge_str_value(conf->watermark, prev->watermark, "");
+
+    ngx_conf_merge_str_value(conf->watermark_position,
+                             prev->watermark_position, "bottom-right");
+
     return NGX_CONF_OK;
 }

@@ -1252,6 +1323,9 @@
         } else if (ngx_strcmp(value[i].data, "size") == 0) {
             imcf->filter = NGX_HTTP_IMAGE_SIZE;

+        } else if (ngx_strcmp(value[i].data, "watermark") == 0) {
+            imcf->filter = NGX_HTTP_IMAGE_WATERMARK;
+
         } else {
             goto failed;
         }

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,235958,235958#msg-235958

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.