Image avec filigrane

:information_source: Summary Automatically adds watermarks to user-uploaded images
:hammer_and_wrench: Repository GitHub - Arkshine/discourse-watermark-image
:question: Install Guide How to install a theme or theme component
:open_book: New to Discourse Themes? Beginner’s guide to using Discourse Themes

Install this theme component

Description

This theme component automatically adds watermarks to user-uploaded images. You can use either an image or a QR code as your watermark, with extensive customization options for position, appearance, and distribution patterns.

The component offers granular control through category and user group settings, allowing you to tailor the watermarking behavior to your community’s needs.

Please review the Important Notes section before implementation.

Features

  • High-performance processing using WebAssembly and Web Workers
  • Comprehensive image format support (PNG, JPEG, BMP, ICO, TIFF, WEBP)
  • Dynamic QR code watermark generation
  • Flexible sizing options (relative or absolute)
  • Versatile positioning system
  • Advanced appearance customization (opacity, rotation, scale, margin, etc.)
  • Multiple blending modes
  • Pattern distribution options (single, grid, diagonal, random)
  • Category and user group-specific settings
  • Live preview in settings panel

Settings

Setting Description
image The image to use as watermark.
Supported formats: PNG, JPEG, BMP, ICO, TIFF, WEBP.
Default: ""
size_mode How the watermark size is calculated:
- relative: Size is relative to the target’s image width.
- absolute: Applied at its original size.
Default: "relative"
relative_width The width of the watermark relative to the target image width (in %).
Only applies when the watermark size mode is set to relative.
Range: 1-100
Default: 10
absolute_scale Scale factor for original watermark size (only used in absolute mode). Min: 0.01
Default: 1
max_size Maximum size as percentage of image dimensions. Range: 1-100
Default: 50
position Position of the watermark: top-left, top-center, top-right, center-left, center, center-right, bottom-left, bottom-center, bottom-right
Default: "bottom-right"
margin_x Horizontal margin from the edge (in % of the target image)
Default: 0
margin_y Vertical margin from the edge (in % of the target image)
Default: 0
opacity Watermark opacity. Range: 1-100
Default: 100
rotate Rotation angle.
Range: -360 to 360 degrees
Default: 0
blend_mode How the watermark blends with the image: normal, overlay, over, atop, xor, plus, multiply, burn, difference, soft_light, screen, hard_light, dodge, exclusion, lighten, darken.
Default: "normal"
pattern Watermark repetition pattern: single, grid, diagonal, random
Default: "single"
pattern_allow_partial Allow partial watermarks at image edges
Default: true
pattern_max_count Maximum number of watermark repetitions (0 for infinite)
Default: 50
pattern_spacing Spacing between repeated watermarks (in % of the target image)
Default: 15
qrcode_enabled Enable QR code watermark
Default: false
qrcode_text Text to encode in QR code. Supports placeholders: {homepage}, {username}, {topic_url}
Default: ""
qrcode_color QR code color (hex or CSS variable)
Default: "var(--primary)"
qrcode_background_color QR code background color (hex or CSS variable)
Default: "var(--secondary)"
qrcode_quiet_zone Width of white space border around QR code (0-10 modules)
Default: 2
qrcode_error_correction Error correction level: Low (~7%), Medium (~15%), Quarter (~25%), High (~30%)
More information about error correction levels can be found here.
Default: "Medium"
categories Categories where watermark should be applied.
Default: ""
groups Groups the watermark should be applied to.
Default: "0"
skip_small_images Skip watermarking if image is below min_image_dimensions.
Default: false
min_image_dimensions Minimum dimensions required (width x height)
Default: "200x200"
allow_non_supported_uploads Allow image uploads to continue even when format is not supported
Default: false

Watermark Types

Image

The component supports multiple image formats: PNG, JPEG, BMP, ICO, TIFF, and WEBP.
See the FAQ section for important information about format support limitations.

QR Code

Generate dynamic QR codes with customizable content using these variables:

  • {homepage} - The URL of the homepage
  • {username} - The username of the user
  • {topic_url} - The URL of the topic

Important: When styling QR code watermarks, consider contrast and sizing. Poor contrast ratios or excessive styling can make QR codes unreadable. Always test your QR code watermarks with scanning apps.

Real-Time Preview

The settings panel includes a real-time preview feature, allowing you to see how your watermark configuration affects a sample image instantly.
The preview window offers several interactive features:

  • Resizable and movable preview window
  • Option to load a random sample image
  • Support for uploading your own test images from your device

On the desktop, it opens automatically. You can also open from the button at the bottom of the page:

More images



:warning: Important Notes

  • Original Images Are Not Preserved
    Watermarks are applied before server upload, and original images are not retained. Thoroughly test your watermark settings before deploying to production.

  • If testing in the admin panel, be careful not to validate your settings immediately. I would recommend creating a group or a category to be safe.

FAQ

Why are image formats limited?

While Discourse converts all uploads to JPEG, this TC watermarking occurs pre-upload on the original format, using specific image processing libraries. While post-upload watermarking is possible, it would require multiple upload/download cycles and affect the composer experience. I’m still exploring improvements to this workflow.

Why isn’t text watermarking supported?

Text watermarking would require extensive configuration options (font selection, styling, etc.) that would be difficult to implement effectively without a dedicated interface. Image watermarks provide more flexibility and can be created using existing design tools.

Roadmap

Future development plans may include:

  • Multiple watermark profiles [1]
  • Original image preservation [2]
  • Post-upload watermarking

Credits

This theme component is powered by:


  1. The upload input is partially supported with the Object settings type – it can’t be done in a TC at the moment. ↩︎

  2. May require plugin development. ↩︎

24 « J'aime »

Ceci est la première version, et je m’attends à des fonctionnalités manquantes. J’attends vos commentaires avec impatience ! :+1:

7 « J'aime »

Merci pour le composant. Ce composant traite-t-il les images ? Ce composant compresse-t-il les images à une taille meilleure que l’original ?

5 « J'aime »

Le composant n’effectue aucune modification ni compression, à part l’application du filigrane.

Discourse prétraite déjà l’image (à l’aide de la bibliothèque squoosh) → le filigrane est appliqué → L’image est téléchargée sur le serveur. C’est ainsi que cela fonctionne.

6 « J'aime »


La première fois que vous ouvrez un article et que vous le modifiez, vous ne pouvez pas y mettre de filigrane. Vous devez le publier, puis cliquer sur « Modifier l’article » et télécharger une image pour y mettre un filigrane.
Le thème utilisé est FKB Pro - Social theme - #375 by MihirR

2 « J'aime »

Vous voulez dire que si vous ouvrez/modifiez un article existant pour la première fois et téléchargez une image, il n’y a pas de filigrane. Est-ce correct ? Pouvez-vous le reproduire à chaque fois ? Voyez-vous une erreur dans la console du navigateur ?

Si je comprends bien, vous vous attendez à ce qu’une image existante téléchargée (avant cette installation de TC) ait un filigrane lorsque vous modifiez l’article (ou que vous ayez un moyen de filigraner l’image manuellement). Cela ne fonctionne pas ainsi. Vous devez télécharger l’image pour appliquer un filigrane.

Avoir un bouton pour filigraner manuellement une image sélectionnée pourrait être une fonctionnalité. Cela vous conviendrait-il ?

Ce sont les images téléchargées après la création d’un nouveau message qui n’ont pas de filigrane. Ce sont les images téléchargées après être entré dans le message après publication et avoir cliqué sur modifier qui ont le filigrane.

Pour le bouton de publication, j’utilise Compose Center - #13

Pouvez-vous faire une courte vidéo, s’il vous plaît ? Ce serait utile pour voir et comprendre ce qui se passe.

1 « J'aime »

3 « J'aime »

Merci de votre patience ! J’ai trouvé le problème. Il devrait être résolu maintenant ! :+1:

3 « J'aime »

J’obtiens cette erreur lors de l’installation de ce composant

Đã xảy ra lỗi: Error creating upload asset: worker_photon_wasm. Original filename Sorry, the file you are trying to upload is not authorized (authorized extensions: jpg, jpeg, png, woff, woff2, svg, eot, ttf, otf, gif, js, dwg).

1 « J'aime »

C’est étrange. Quelle est votre version de Discourse ?
Vous pouvez essayer d’ajouter l’extension wasm dans les listes autorisées, mais cela fonctionne bien dans mes deux installations locales et de production sans aucune modification. :thinking:

1 « J'aime »

Je vais vous faire part de mes commentaires. Je ne sais pas ce qui se passe, mais il semble que les utilisateurs chinois n’aient pas de filigranes sur leurs images téléchargées.

Mais j’utilise un compte nouvellement créé avec ce mode sans trace activé et cela fonctionne, donc je ne sais pas quel est le problème.

Parfois ça marche, parfois ça ne marche pas.

Les images à retirer sont .jpeg .png Mais tout comme l’image dans la vidéo, je copie l’image et je la télécharge et elle est filigranée, donc je ne sais pas quel est le problème.

Merci pour vos commentaires !

Pour vous, peu importe comment vous essayez, cela fonctionne toujours, n’est-ce pas ?

Pouvez-vous demander à certains de vos utilisateurs de vérifier la console du navigateur si cela se produit et de vous copier tout message d’erreur qu’ils voient ? Aussi, s’ils utilisent un appareil mobile (Android, iPhone, etc.) - S’ils peuvent expliquer ce qu’ils ont fait exactement pour voir si cela peut aider, ce serait apprécié.

Cela ne ressemble pas à un problème avec l’image elle-même si vous pouvez ensuite appliquer un filigrane à l’image vous-même. Ce qui reste, c’est soit une erreur dans le code comme le problème précédent, soit une erreur dans le processus de filigranage. Malheureusement, je ne peux pas le reproduire, peu importe ce que je fais.

Je vais voir à mettre à jour le composant plus tard pour m’assurer que toutes les erreurs sont interceptées et affichées à l’utilisateur.

Bonjour, merci d’avoir créé ce composant.
Lorsque j’ai essayé de télécharger une photo de filigrane, cette erreur s’est produite. J’ai essayé le JPEG et le Webp également, mais sans succès.

Mon forum Discourse est à jour

1 « J'aime »

Salut @LaptechInfo

C’est étrange. À ce stade, le TC ne devrait rien faire. Ce sont les paramètres de téléchargement standard.
Pouvez-vous regarder dans la console du navigateur et voir si des messages d’erreur s’affichent ?

Est-il possible de fournir une image qui échoue afin que je puisse tester de mon côté également ?

1 « J'aime »

Salut, j’ai essayé de nombreuses images au hasard, mais aucune n’a fonctionné.
Je ne suis pas programmeur, je n’ai aucune connaissance en informatique.
Essayez cette image, j’ai abandonné.
laptechinfo webp.zip (558 octets)
watermark.zip (257,7 Ko)

@Arkshine

1 « J'aime »

Merci ! Pouvez-vous également afficher le contenu de votre console ? L’onglet juste après. Je pense que cela pourrait aider.

EDIT : Je pense que je peux le reproduire, laissez-moi voir, et je reviens vers vous bientôt !

Onglet Console


@Arkshine

@LaptechInfo Merci ! Il y a un bug dans Discourse suite à une PR d’hier. J’ai créé un sujet : Can't upload image in settings. :+1:

3 « J'aime »