Welcome to a quick tutorial on how to add a watermark to an image in Python. Want to automatically add a watermark to images in Python? Well, it is thankfully easy – Let us walk through some examples in this guide. Read on!
TLDR – QUICK SLIDES
Fullscreen Mode – Click Here
TABLE OF CONTENTS
PYTHON WATERMARK IMAGES
All right, let us now get into the examples of adding a watermark to images in Python.
The “usual stuff”:
- Create a virtual environment
- Activate it –
- Install required libraries –
pip install pillow
EXAMPLE 1) SIMPLE TEXT WATERMARK
# (A) REQUIRED MODULES from PIL import Image from PIL import ImageDraw from PIL import ImageFont # (B) SETTINGS # (B1) TEXT SETTINGS txt = "Copyright" # text to write txtFont = ImageFont.truetype("c:/windows/arial.ttf", 60) # font & font size txtColor = (255, 255, 255) # text color txtCoord = (0, 0) # place the text here # (B2) SAVE SETTINGS source = "source.png" # source image target = "demoA.webp" # save to this file quality = 90 # image quality # (C) DRAW TEXT & SAVE img = Image.open(source) ImageDraw.Draw(img).text(txtCoord, txt, font=txtFont, fill=txtColor) img.save(target, format="webp", quality=quality)
- Load the pillow image library. Captain Obvious at your service.
- A whole bunch of settings, these should be self-explanatory when you read through them one by one.
- Yep, 3 lines are all we need to “embed” a watermark.
img = Image.open(source)Open the source image.
ImageDraw.Draw(img).text(...)Draw text onto the source image.
img.save()Save the processed image. The end.
EXAMPLE 2) IMAGE WATERMARK
# (A) REQUIRED MODULES from PIL import Image # (B) SETTINGS source = "source.png" # source image watermark = "watermark.png" # watermark image target = "demoB.webp" # save to this file quality = 90 # image quality # (C) DRAW WATERMARK & SAVE imgS = Image.open(source).convert("RGBA") imgW = Image.open(watermark) imgS.paste(imgW, (0,0), imgW.convert("RGBA")) imgS.save(target, format="webp", quality=quality)
- Load the Pillow Image Library.
- The file name of the source image, watermark image (best to have a transparent background), and processed image.
- That’s right. We are pretty much opening both the source and watermark images here, then just paste the watermark onto the source.
paste() takes in 3 parameters – First is the image to paste, second are the coordinates of where to paste it to, and the last is the transparency mask… Let’s keep things simple and just say that the last one is necessary to properly render the watermark’s transparent background.
EXAMPLE 3) CENTERED WATERMARK
# (A) REQUIRED MODULES from PIL import Image # (B) SETTINGS source = "source.png" # source image watermark = "watermark.png" # watermark image target = "demoC.webp" # save to this file quality = 90 # image quality # (C) CALCULATE CENTER imgS = Image.open(source).convert("RGBA") imgW = Image.open(watermark) dimSX, dimSY = imgS.size dimWX, dimWY = imgW.size center = ((dimSX - dimWX) // 2, (dimSY - dimWY) // 2) # (D) DRAW WATERMARK & SAVE imgS.paste(imgW, center, imgW.convert("RGBA")) imgS.save(target, format="webp", quality=quality)
It’s pretty much the same “paste watermark onto source image”, but remember that we can specify where to paste the watermark. So in section (C), we calculate the exact center coordinates. For those who don’t catch it, it’s simply –
(SOURCE WIDTH/HEIGHT - WATERMARK WIDTH/HEIGHT) ÷ 2.
DOWNLOAD & NOTES
Here is the download link to the example code, so you don’t have to copy-paste everything.
SORRY FOR THE ADS...
But someone has to pay the bills, and sponsors are paying for it. I insist on not turning Code Boxx into a "paid scripts" business, and I don't "block people with Adblock". Every little bit of support helps.
EXAMPLE CODE DOWNLOAD
Click here for the source code on GitHub gist, just click on “download zip” or do a git clone. I have released it under the MIT license, so feel free to build on top of it or use it in your own project.
EXTRA BITS & LINKS
That’s all for the tutorial, and here is a small section on some extras and links that may be useful to you.
EXTRA – TRANSPARENT TEXT
imgA = Image.open(source).convert("RGBA") imgB = Image.new("RGBA", imgA.size, (255, 255, 255, 0)) ImageDraw.Draw(imgB).text((0,0), "TEXT", font="FONT.TTF", fill=(0, 0, 0, 128)) imgC = Image.alpha_composite(imgA, imgB) imgC.show()
Yes, we can draw transparent text. As from the example on the official Pillow menu –
- We create 2 layers –
imgAis the source image,
imgBis for the text.
- Write text onto
imgB– Take note that we specify the opacity now.
- Composite (combine)
imgB, save it.
LINKS & REFERENCES
INFOGRAPHIC CHEAT SHEET
Thank you for reading, and we have come to the end. I hope that it has helped you to better understand, and if you want to share anything with this guide, please feel free to comment below. Good luck and happy coding!