Click here to Skip to main content
15,867,686 members
Articles / Programming Languages / C#

Pixel Addition Watermarking

Rate me:
Please Sign up or sign in to vote.
3.50/5 (9 votes)
17 Feb 2009CPOL1 min read 34.9K   1K   24   6
A application that shows how to add pixels to create a visible watermark without using GDI.

Introduction

In this article, I would like to explain about a visible watermarking method using pixel addition. I am writing this article because most articles I have read about visible watermarking use GDI (which, I think is complicated). So I thought, why not use simple math, considering that a pixel is a matrix value. In this application, I use Visual Studio 2005 with C#.

Background

A pixel in a digital image is a matrix value ranging between 0 - 255. So, in 1024 x 600 digital image, there will be 1024 x 600 pixels. How does the matrix addition work? Just add the cover image pixel value with the watermark pixel value.

result Pixel = cover Pixel + mark Pixel

To give an opacity option, use a double value as opacity ranging between 0.1 - 1.9, and then you will get:

result Pixel = cover Pixel + (mark Pixel * opacity)

Using the code

The code in C# for the pixel addition would be like this:

C#
private int pixelVal(int avemark, int pixcover, double opacity)
{
    if (pixcover + (avemark * opacity) > 255)
    {
        return pixcover = 255;
    }
    else
    {
        return pixcover = Convert.ToInt32(pixcover + (avemark * opacity));
    }
}

And then on the Process button, simply process the whole matrix using a "for" loop. Just like in the code below:

C#
watermarkBmp = (Bitmap)Bitmap.FromFile(openWatermark);
coverBmp = (Bitmap)Bitmap.FromFile(openCover);
resultBmp = null;
int red = 0;
int green = 0;
int blue = 0;
double opacity = Convert.ToDouble(comboBox1.Text);

for (int i = 0; i < watermarkBmp.Height; i++)
{
    for (int j = 0; j < watermarkBmp.Width; j++)
    {
        //kalau watermark terlalu besar, kenapa error?
        red = pixelVal(watermarkBmp.GetPixel(i, j).R, coverBmp.GetPixel(i, j).R, opacity);
        green = pixelVal(watermarkBmp.GetPixel(i, j).G, coverBmp.GetPixel(i, j).G, opacity);
        blue = pixelVal(watermarkBmp.GetPixel(i, j).B, coverBmp.GetPixel(i, j).B, opacity);
        coverBmp.SetPixel(i, j, Color.FromArgb(red, green, blue));
    }
}

pictureBox2.Width = coverBmp.Width;
pictureBox2.Height = coverBmp.Height;
pictureBox2.Image = coverBmp;

Points of interest

For me, using the matrix addition is much simpler than using GDI. And, it could have more options such as translation etc. Watermarking is fun, because there are many things to explore about it.

History

The first time I learned about watermarking was when I was working on my thesis about visible and invisible watermarking. But, when I searched for articles and code for visible watermarking, most of them were using GDI (brush, etc.). And, this is my first small version without using GDI.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Junior)
Indonesia Indonesia
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralMy vote of 2 Pin
Qwertie28-Feb-09 4:16
Qwertie28-Feb-09 4:16 
This code will be very slow. You call GetPixel 6 times and SetPixel once per pixel. These methods are slow because they have to examine the pixel format of the bitmap each time you call them to decide HOW to get or set the pixel; also they must compute the address of the pixel to get/set on each call. I guess it's okay if you're only putting a watermark on a single image, but it's bad for movies or large bitmaps.
AnswerRe: My vote of 2 Pin
vidyaputra5-Mar-09 20:44
vidyaputra5-Mar-09 20:44 
GeneralMy vote of 2 Pin
Qistoph17-Feb-09 23:14
Qistoph17-Feb-09 23:14 
GeneralRe: My vote of 2 Pin
vidyaputra18-Feb-09 18:02
vidyaputra18-Feb-09 18:02 
Generalhi Pin
Member 322005217-Feb-09 22:08
Member 322005217-Feb-09 22:08 
GeneralRe: hi Pin
vidyaputra18-Feb-09 18:00
vidyaputra18-Feb-09 18:00 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.