jpeg: Module de filtre JPEG NGINX
Installation
Vous pouvez installer ce module dans n'importe quelle distribution basée sur RHEL, y compris, mais sans s'y limiter :
- RedHat Enterprise Linux 7, 8, 9 et 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 et Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-jpeg
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-jpeg
Activez le module en ajoutant ce qui suit en haut de /etc/nginx/nginx.conf :
load_module modules/ngx_http_jpeg_filter_module.so;
Ce document décrit nginx-module-jpeg v1.0.1 publié le 04 septembre 2018.
Module de filtre Nginx pour ajouter des superpositions sur des JPEG à la volée avec libmodjpeg.
Avec libmodjpeg, vous pouvez superposer une image (masquée) sur un JPEG existant de manière aussi sans perte que possible. Les modifications dans le JPEG n'ont lieu que là où l'image superposée est appliquée. Toutes les modifications se produisent dans le domaine DCT, ainsi le JPEG est décodé et encodé sans perte.
- Utilisations typiques
- Essayez-le
- Installation
- Compatibilité
- Synopsis
- Directives
- jpeg_filter
- jpeg_filter_max_pixel
- jpeg_filter_buffer
- jpeg_filter_optimize
- jpeg_filter_progressive
- jpeg_filter_arithmetric
- jpeg_filter_graceful
- jpeg_filter_effect
- jpeg_filter_dropon_align
- jpeg_filter_dropon_offset
- jpeg_filter_dropon_file
- jpeg_filter_dropon_memory
- Notes
- Licence
- Remerciements
Utilisations typiques
Ce module de filtre peut ajouter des superpositions (par exemple, un logo, un filigrane visuel) sur des JPEG lorsqu'ils sont demandés.
Quelques idées :
- Considérez que vous êtes photographe et que vous avez une galerie d'images sur votre site web. Sans coder en dur votre logo (marque, filigrane, ...) dans ces images, vous pouvez l'appliquer au moment où l'image est demandée. Chaque fois que vous mettez à jour votre logo, il vous suffit de mettre à jour la configuration nginx et c'est fait. Pas besoin de retraiter toutes vos images.
- Vous avez une boutique en ligne avec des milliers d'images de produits. En configurant simplement nginx, vous pouvez ajouter votre logo à toutes les images de produits. Vous n'avez pas besoin de traiter toutes les images de produits.
- Vous avez un service payant. Ajoutez un filigrane à toutes les images si l'utilisateur n'est pas abonné. Si l'utilisateur est abonné, n'appliquez pas le filigrane ou mettez simplement un petit logo sur les images sans toucher aux images originales.
- Sur votre site web, les utilisateurs enregistrés peuvent télécharger des images. Ajoutez l'avatar de l'utilisateur à l'image qui a été téléchargée sans la traiter après le téléchargement. Si l'utilisateur change son avatar, toutes ses images auront automatiquement le nouvel avatar.
Essayez-le
Pour essayer ce module de filtre, tirez l'image docker
docker pull ioppermann/modjpeg-nginx:latest
Le conteneur docker expose le port TCP 80 et attend un répertoire avec des images montées sur /images, par exemple :
docker run -it --rm --name=modjpeg-nginx \
--mount type=bind,src=$PWD/images,dst=/images,readonly \
-p 8080:80 \
ioppermann/modjpeg-nginx:latest
Vous pouvez maintenant naviguer vers http://localhost:8080/ et cliquer sur les images listées. Le logo modjpeg sera appliqué dans le coin supérieur gauche. Par défaut, seules les images de moins de 10 Mo sont traitées par le filtre. Arrêtez le conteneur en appuyant sur Ctrl-c.
Le filtre peut être contrôlé par ces variables d'environnement :
| Nom | Par défaut | Description |
|---|---|---|
| MJ_GRACEFUL | on | Voir jpeg_filter_graceful |
| MJ_BUFFER | 10M | Voir jpeg_filter_buffer |
| MJ_MAX_PIXEL | 0 | Voir jpeg_filter_max_pixel |
| MJ_DROPON_ALIGN | "top left" | Voir jpeg_filter_dropon_align |
| MJ_DROPON_OFFSET | "0 0" | Voir jpeg_filter_dropon_offset |
| MJ_DROPON_FILE | "/usr/local/nginx/conf/dropon.png" | Voir jpeg_filter_dropon_file |
L'exemple suivant permettra des images allant jusqu'à 150 mégapixels (MJ_MAX_PIXEL) et 100 Mo en taille de fichier (MJ_BUFFER). Le logo sera placé dans le coin inférieur droit (MJ_DROPON_ALIGN)
avec un décalage de -15px horizontalement et verticalement (MJ_DROPON_OFFSET).
docker run -it --rm --name=modjpeg-nginx \
--mount type=bind,src=$PWD/images,dst=/images,readonly \
-p 8080:80 \
-e MJ_MAX_PIXEL=150000000 \
-e MJ_BUFFER=100M \
-e MJ_DROPON_ALIGN="bottom right" \
-e MJ_DROPON_OFFSET="-15 -15" \
ioppermann/modjpeg-nginx:latest
Pour changer le logo, vous pouvez monter un volume supplémentaire ou le mettre dans le répertoire que vous montez déjà, par exemple :
docker run -it --rm --name=modjpeg-nginx \
--mount type=bind,src=$PWD/images,dst=/images,readonly \
-p 8080:80 \
-e MJ_DROPON_FILE="/images/logo.png" \
ioppermann/modjpeg-nginx:latest
Cloner et installer libmodjpeg
git clone https://github.com/ioppermann/libmodjpeg.git cd libmodjpeg cmake . make make install cd ..
Cloner modjpeg-nginx
git clone https://github.com/ioppermann/modjpeg-nginx.git
Télécharger et installer nginx
wget 'http://nginx.org/download/nginx-1.15.1.tar.gz' tar -xvzf nginx-1.15.1.tar.gz cd nginx-1.15.1
Configurer comme module statique, ou ...
./configure --add_module=../modjpeg-nginx
... configurer comme module dynamique (à partir de nginx 1.9.11)
./configure --add_dynamic_module=../modjpeg-nginx
Si la bibliothèque libmodjpeg n'est pas trouvée, ajoutez par exemple '--with-ld-opt=-L/usr/local/lib' aux
options de configuration si elle a été installée dans /usr/local/lib
Vous voudrez peut-être utiliser les autres options './configure' qui sont utilisées
dans votre compilation nginx actuelle. Vérifiez la sortie de 'nginx -V'.
make make install
Si vous avez configuré modjpeg-nginx comme module dynamique, vous devez charger le module au début de la configuration
```nginx
...
load_module modules/ngx_http_jpeg_filter_module.so;
...
Synopsis
...
location /gallery {
# activer le module de filtre jpeg
jpeg_filter on;
# limiter les tailles d'image à 9 mégapixels
jpeg_filter_max_pixel 9000000;
# limiter la taille des fichiers image à 5 mégaoctets
jpeg_filter_buffer 5M;
# livrer les images non modifiées si l'une des limites s'applique
jpeg_filter_graceful on;
# pixeliser l'image
jpeg_filter_effect pixelate;
# ajouter un logo masqué dans le coin inférieur droit
# avec une distance de 10 pixels de la bordure
jpeg_filter_dropon_align bottom right;
jpeg_filter_dropon_offset -10 -10;
jpeg_filter_dropon_file /path/to/logo.jpg /path/to/mask.jpg;
}
...
Ou utilisez-le avec OpenResty's ngx_http_lua_module et un logo PNG :
...
location /gallery {
set_by_lua_block $valign {
local a = { 'top', 'center', 'bottom' }
return a[math.random(#a)]
}
set_by_lua_block $halign {
local a = { 'left', 'center', 'right' }
return a[math.random(#a)]
}
# activer le module de filtre jpeg
jpeg_filter on;
# limiter les tailles d'image à 9 mégapixels
jpeg_filter_max_pixel 9000000;
# limiter la taille des fichiers image à 5 mégaoctets
jpeg_filter_buffer 5M;
# livrer les images non modifiées si l'une des limites s'applique
jpeg_filter_graceful on;
# pixeliser l'image
jpeg_filter_effect pixelate;
# ajouter un logo à une position aléatoire
jpeg_filter_dropon_align $valign $halign;
jpeg_filter_dropon_file /path/to/logo.png;
}
...
Ou générez un logo avec Lua-GD :
http {
...
...
server {
...
location /gallery {
set_by_lua_block $logobytestream {
local gd = require "gd"
local im = gd.create(210, 70)
local white = im:colorAllocate(255, 255, 255)
local black = im:colorAllocate(0, 0, 0)
im:filledRectangle(0, 0, 140, 80, white)
im:string(gd.FONT_LARGE, 10, 10, "Hello modjpeg", black)
im:string(gd.FONT_LARGE, 10, 40, os.date("%c"), black);
return im:jpegStr(85)
}
# activer le module de filtre jpeg
jpeg_filter on;
# limiter les tailles d'image à 9 mégapixels
jpeg_filter_max_pixel 9000000;
# limiter la taille des fichiers image à 5 mégaoctets
jpeg_filter_buffer 5M;
# livrer les images non modifiées si l'une des limites s'applique
jpeg_filter_graceful on;
# pixeliser l'image
jpeg_filter_effect pixelate;
# ajouter un logo généré dans le coin inférieur droit
# avec une distance de 10 pixels de la bordure
jpeg_filter_dropon_align bottom right;
jpeg_filter_dropon_offset -10 -10;
jpeg_filter_dropon_memory $logobytestream;
}
...
}
...
}
Directives
- jpeg_filter
- jpeg_filter_max_pixel
- jpeg_filter_buffer
- jpeg_filter_optimize
- jpeg_filter_progressive
- jpeg_filter_arithmetric
- jpeg_filter_graceful
- jpeg_filter_effect
- jpeg_filter_dropon_align
- jpeg_filter_dropon_offset
- jpeg_filter_dropon_file
- jpeg_filter_dropon_memory
- Notes
jpeg_filter
Syntaxe : jpeg_filter on | off
Par défaut : jpeg_filter off
Contexte : location
Activez le module de filtre jpeg.
Cette directive est désactivée par défaut.
jpeg_filter_max_pixel
Syntaxe : jpeg_filter_max_pixel pixel
Par défaut : 0
Contexte : http, server, location
Nombre maximum de pixels dans l'image à traiter. Si l'image a plus de pixels (largeur * hauteur) que pixel, le filtre jpeg renverra un "415 Unsupported Media Type".
Définissez jpeg_filter_graceful sur on pour livrer l'image inchangée. Définissez le nombre maximum de pixels à 0 pour ignorer les dimensions de l'image.
Cette directive est définie sur 0 par défaut.
jpeg_filter_buffer
Syntaxe : jpeg_filter_buffer size
Par défaut : 2M
Contexte : http, server, location
La taille de fichier maximale de l'image à traiter. Si la taille du fichier est supérieure à size, le filtre jpeg renverra un "415 Unsupported Media Type".
Définissez jpeg_filter_graceful sur on pour livrer l'image inchangée.
Cette directive est définie sur 2 mégaoctets par défaut.
jpeg_filter_optimize
Syntaxe : jpeg_filter_optimize on | off
Par défaut : off
Contexte : http, server, location
Lors de la livraison, optimisez les tables de Huffman de l'image.
Cette directive est désactivée par défaut.
jpeg_filter_progressive
Syntaxe : jpeg_filter_progressive on | off
Par défaut : off
Contexte : http, server, location
Lors de la livraison, activez l'encodage progressif de l'image.
Cette directive est désactivée par défaut.
jpeg_filter_arithmetric
Syntaxe : jpeg_filter_arithmetric on | off
Par défaut : off
Contexte : http, server, location
Lors de la livraison, activez l'encodage arithmétique de l'image. Cela remplacera la directive jpeg_filter_optimize. L'encodage arithmétique n'est généralement pas pris en charge par les navigateurs.
Cette directive est désactivée par défaut.
jpeg_filter_graceful
Syntaxe : jpeg_filter_graceful on | off
Par défaut : off
Contexte : http, server, location
Permet de livrer l'image inchangée dans le cas où les directives jpeg_filter_max_width, jpeg_filter_max_height ou jpeg_filter_buffer renverraient une erreur "415 Unsupported Media Type".
Cette directive est désactivée par défaut.
jpeg_filter_effect
Syntaxe : jpeg_filter_effect grayscale | pixelate
Syntaxe : jpeg_filter_effect darken | brighten value
Syntaxe : jpeg_filter_effect tintblue | tintyellow | tintred | tintgreen value
Par défaut : -
Contexte : location
Appliquez un effet à l'image.
grayscale supprimera tous les composants de couleur de l'image. Cela ne s'applique qu'aux images dans l'espace colorimétrique YCbCr.
pixelate pixelisera l'image en blocs de 8x8 pixels en définissant les coefficients AC dans tous les composants à 0.
darken assombrira l'image en diminuant les coefficients DC dans le composant Y de value. Cela ne s'applique qu'aux images dans l'espace colorimétrique YCbCr.
brighten éclaircira l'image en augmentant les coefficients DC dans le composant Y de value. Cela ne s'applique qu'aux images dans l'espace colorimétrique YCbCr.
tintblue teintera l'image en bleu en augmentant les coefficients DC dans le composant Cb de value. Cela ne s'applique qu'aux images dans l'espace colorimétrique YCbCr.
tintyellow teintera l'image en jaune en diminuant les coefficients DC dans le composant Cb de value. Cela ne s'applique qu'aux images dans l'espace colorimétrique YCbCr.
tintred teintera l'image en rouge en augmentant les coefficients DC dans le composant Cr de value. Cela ne s'applique qu'aux images dans l'espace colorimétrique YCbCr.
tintgreen teintera l'image en vert en diminuant les coefficients DC dans le composant Cr de value. Cela ne s'applique qu'aux images dans l'espace colorimétrique YCbCr.
Cette directive n'est pas définie par défaut.
Tous les paramètres peuvent contenir des variables.
jpeg_filter_dropon_align
Syntaxe : jpeg_filter_dropon_align [top | center | bottom] [left | center | right]
Par défaut : center center
Contexte : location
Alignez la superposition sur l'image. Utilisez la directive jpeg_filter_dropon_offset pour décaler la superposition par rapport à l'alignement.
Cette directive doit être définie avant jpeg_filter_dropon pour avoir un effet sur la superposition.
Cette directive appliquera la superposition au centre de l'image par défaut.
Tous les paramètres peuvent contenir des variables.
jpeg_filter_dropon_offset
Syntaxe : jpeg_filter_dropon_offset vertical horizontal
Par défaut : 0 0
Contexte : location
Décalez la superposition de vertical et horizontal pixels par rapport à l'alignement donné avec la directive jpeg_filter_dropon_align.
Utilisez une valeur négative pour déplacer la superposition vers le haut ou à gauche et une valeur positive pour déplacer la superposition vers le bas ou à droite.
Cette directive doit être définie avant jpeg_filter_dropon pour avoir un effet sur la superposition.
Cette directive n'appliquera pas de décalage par défaut.
Tous les paramètres peuvent contenir des variables.
jpeg_filter_dropon_file
Syntaxe : jpeg_filter_dropon_file image
Syntaxe : jpeg_filter_dropon_file image mask
Par défaut : -
Contexte : location
Appliquez une superposition à l'image. La superposition est donnée par un chemin vers une image JPEG ou PNG pour image et éventuellement un chemin vers une image JPEG pour mask. Si aucune image de masque n'est fournie, l'image sera appliquée sans translucidité. Si une image de masque est fournie, seul le composant de luminance sera utilisé. Pour le masque, le noir signifie entièrement translucide et le blanc signifie entièrement opaque. Toutes les valeurs intermédiaires mélangeront l'image sous-jacente et la superposition en conséquence. Si image est un chemin vers un PNG, le masque sera ignoré.
Cette directive n'est pas définie par défaut.
Tous les paramètres peuvent contenir des variables.
Si aucun des paramètres ne contient de variables, la superposition est chargée lors du chargement de la configuration. Si au moins un paramètre contient des variables, la superposition sera chargée lors du traitement de la requête. Après le traitement de la requête, la superposition sera déchargée.
Les fichiers PNG en tant que superposition ne sont pris en charge que si libmodjpeg a été compilé avec le support PNG.
jpeg_filter_dropon_memory
Syntaxe : jpeg_filter_dropon_memory $image
Syntaxe : jpeg_filter_dropon_memory $image $mask
Par défaut : -
Contexte : location
Appliquez une superposition à l'image. La superposition est donnée par une variable contenant un flux d'octets d'image JPEG ou PNG pour $image et éventuellement une variable pour un flux d'octets d'image JPEG pour $mask.
Si aucune image de masque n'est fournie, l'image sera appliquée sans translucidité. Si une image de masque est fournie, seul le composant de luminance sera utilisé. Pour le masque, le noir signifie entièrement translucide et le blanc signifie entièrement opaque. Toutes les valeurs intermédiaires mélangeront l'image sous-jacente et la superposition en conséquence. Si $image est un PNG, le masque sera ignoré.
Cette directive n'est pas définie par défaut.
Tous les paramètres sont censés être des variables.
La superposition sera toujours chargée lors du traitement de la requête. Après le traitement de la requête, la superposition sera déchargée.
Les flux d'octets PNG en tant que superposition ne sont pris en charge que si libmodjpeg a été compilé avec le support PNG.
Notes
Les directives jpeg_filter_effect, jpeg_filter_dropon_align, jpeg_filter_dropon_offset et jpeg_filter_dropon sont appliquées dans l'ordre dans lequel elles apparaissent dans le fichier de configuration nginx, c'est-à-dire qu'il est important de savoir si vous appliquez d'abord un effet puis ajoutez une superposition ou vice versa. Dans le premier cas, la superposition ne sera pas affectée par l'effet et dans le second cas, l'effet sera également appliqué à la superposition.
Remerciements
Ce module est fortement inspiré du module de filtre d'image nginx avec des idées provenant de "Emiller’s Guide To Nginx Module Development" et du guide de développement nginx.
GitHub
Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-jpeg.