Add text or logo watermark to images in the browser. Client-side, fast, beautiful — no server needed. Supports tiled patterns, 9-point positioning, responsive scaling, and full opacity/rotation control.
Tiled Pattern Mode — Repeat watermark across entire image (anti-crop protection, like Shutterstock)
Responsive Scaling — Logo/text auto-scales based on image resolution (no more tiny watermarks on 4K images)
Rotation & Opacity — Full control over angle and transparency
🌍 Multilingual Font Auto-Loading — Auto-detects script (CJK, Arabic, Thai, Vietnamese, Cyrillic, Devanagari...) and loads the correct Google Noto font. No more □□□ tofu boxes!
100% Client-Side — Uses HTML5 Canvas, no server required
// Logo auto-scales to 15% of image widthconstwatermarked=awaitaddWatermark(imageFile,{type: 'image',source: './logo.png',// URL string// imageElement: logoBlob, // or File/Blob/HTMLImageElementposition: 'bottom-right',width: 0.15,// 15% of image widthopacity: 0.7,padding: 20,});
Tiled Pattern (Anti-Crop Protection)
constwatermarked=awaitaddWatermark(imageFile,{type: 'text',text: 'Bản quyền thuộc Miconvert',mode: 'tiled',opacity: 0.3,rotate: -45,fontSize: 36,color: 'rgba(255, 255, 255, 0.4)',});
Text watermarks automatically detect the language/script of your text and load the correct Google Noto font via the FontFace API. No manual font configuration needed!
Script
Languages
Auto-loaded Font
CJK (Simplified Chinese)
Chinese
Noto Sans SC
Japanese
Japanese
Noto Sans JP
Korean
Korean
Noto Sans KR
Arabic
Arabic, Persian, Urdu
Noto Sans Arabic
Devanagari
Hindi, Sanskrit, Marathi
Noto Sans Devanagari
Bengali
Bengali, Assamese
Noto Sans Bengali
Thai
Thai
Noto Sans Thai
Vietnamese
Vietnamese
Noto Sans
Cyrillic
Russian, Ukrainian
Noto Sans
Hebrew
Hebrew
Noto Sans Hebrew
Tamil
Tamil
Noto Sans Tamil
Latin
English, European
Noto Sans
Custom Font Loading
import{loadCustomFont,addWatermark}from'@miconvert/image-watermark';// Load a custom font from URLawaitloadCustomFont('MyBrand','https://example.com/fonts/mybrand.woff2');constresult=awaitaddWatermark(imageFile,{type: 'text',text: 'My Brand™',fontFamily: 'MyBrand',// ...other options});
⚠️ Important Notes
EXIF metadata is lost — Canvas processing strips EXIF data (GPS, camera info, orientation). Modern browsers auto-apply EXIF orientation before drawing, so images will look correct, but the metadata is not preserved in the output.
iOS Safari limit — Images larger than ~16.7 megapixels are automatically downscaled to prevent Safari crashes. A console warning is logged when this happens.
SSR / Node.js — This library requires a browser environment (DOM + Canvas). In Next.js/Nuxt, use dynamic import() or check typeof window !== 'undefined' before importing.
Animated GIF — Only the first frame is watermarked. Canvas API does not support multi-frame GIF rendering.
AVIF output — When using outputType: 'image/avif', color quality depends on your browser's AVIF encoder. Chrome 121+ and Safari 17+ produce good results.
🌐 Browser Support
Works in all modern browsers that support HTMLCanvasElement.toBlob() and FontFace API:
Chrome 50+, Firefox 19+, Safari 11+, Edge 79+