Watermark de imagem

: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 curtidas

Esta é a primeira versão, e eu espero recursos ausentes. Estou ansioso por qualquer feedback! :+1:

7 curtidas

Obrigado pelo componente. Este componente processa imagens? Este componente comprime imagens para um tamanho melhor que o original.

5 curtidas

O componente não realiza nenhuma modificação ou compressão além da aplicação da marca d’água.

O Discourse já pré-processa a imagem primeiro (usando a biblioteca squoosh) → a marca d’água é aplicada → A imagem é carregada para o servidor. Seria assim que funciona.

6 curtidas


Na primeira vez que você abre uma postagem e a edita, não é possível adicionar uma marca d’água. É preciso publicá-la e, em seguida, clicar em editar postagem e carregar uma imagem para adicionar uma marca d’água.
O tema usado é FKB Pro - Social theme - #375 by MihirR

2 curtidas

Você quer dizer que se você abrir/editar uma postagem existente pela primeira vez e carregar uma imagem, não haverá marca d’água. Isso está correto? Você consegue reproduzir isso todas as vezes? Você vê algum erro no console do navegador?

Se eu entendi corretamente, você espera que uma imagem existente carregada (antes desta instalação do TC) tenha uma marca d’água quando você editar a postagem (ou tenha uma maneira de colocar marca d’água na imagem manualmente). Não funciona dessa maneira. Você precisa carregar a imagem para aplicar uma marca d’água.

Ter um botão para colocar marca d’água em uma imagem selecionada manualmente poderia ser um recurso. Isso funcionaria para você?

São as imagens carregadas após a criação de uma nova postagem que não têm marca d’água. São as imagens carregadas após entrar na postagem depois de publicar e clicar em editar que têm a marca d’água.

Para o botão de postagem, uso Compose Center - #13

Você pode fazer um vídeo rápido, por favor? Seria útil para ver e entender o que está acontecendo.

1 curtida

3 curtidas

Obrigado pela sua paciência! Encontrei o problema. Deve estar corrigido agora! :+1:

3 curtidas

Ocorreu um erro ao instalar este componente

Đã xảy ra lỗi: Error creating upload asset: worker_photon_wasm. Original filename Desculpe, o arquivo que você está tentando carregar não é autorizado (extensões autorizadas: jpg, jpeg, png, woff, woff2, svg, eot, ttf, otf, gif, js, dwg).

1 curtida

Isso é estranho. Qual é a sua versão do Discourse?
Você pode tentar adicionar a extensão wasm às listas permitidas, mas funciona bem nas minhas duas instalações locais e de produção sem nenhuma alteração. :thinking:

1 curtida

Vou dar um feedback, não sei o que está acontecendo, mas parece que os usuários chineses não têm marcas d’água em suas imagens carregadas.

Mas estou usando uma conta recém-criada com o modo sem rastros ativado e está funcionando, então não sei qual é o problema.

Às vezes funciona, às vezes não.

As imagens que são removidas são .jpeg .png Mas, assim como a imagem no vídeo, copio a imagem e a carrego e ela tem marca d’água, então não sei qual é o problema.

Obrigado pelo feedback!

Para você, não importa como você tente, sempre funciona, certo?

Você pode pedir a alguns de seus usuários para verificarem o console do navegador se isso acontecer e copiarem qualquer mensagem de erro que virem para você? Além disso, se eles estão usando um dispositivo móvel (android, iphone, etc) - Se eles puderem explicar o que fizeram exatamente para ver se isso pode ajudar, seria bem-vindo.

Não parece ser um problema com a imagem em si se você puder aplicar a marca d’água na imagem mais tarde. O que resta é um erro no código, como o problema anterior, ou um erro no processo de marca d’água. Infelizmente, não consigo reproduzir, não importa o que eu faça.

Vou ver para atualizar o componente mais tarde para garantir que quaisquer erros sejam capturados e exibidos ao usuário.

Olá, obrigado por criar este componente.
Ao tentar carregar uma foto de marca d’água, recebi este erro. Tentei JPEG e Webp também, mas sem sucesso.

Meu fórum Discourse está atualizado

1 curtida

Olá @LaptechInfo

Isso é estranho. Neste ponto, o TC não deveria fazer nada. Esta é a configuração padrão de upload.
Você pode verificar o console do navegador e ver se há alguma mensagem de erro?

É possível fornecer uma imagem que falha para que eu possa testar do meu lado também?

1 curtida

Olá, tentei muitas imagens aleatoriamente, mas nenhuma delas funcionou.
Não sou programador, não tenho conhecimento em nenhuma linguagem de computador.
Tente esta imagem, eu tentei.
laptechinfo webp.zip (558 Bytes)
watermark.zip (257,7 KB)

@Arkshine

1 curtida

Obrigado! Você também pode mostrar o conteúdo do seu Console? A aba logo depois. Acho que pode ajudar.

EDIT: Acho que consigo reproduzir, deixe-me ver e volto em breve!

Guia do console


@Arkshine

@LaptechInfo Obrigado! Há um bug no Discourse de um PR de ontem. Criei um tópico: Can't upload image in settings. :+1:

3 curtidas