PngWatermarker

PngWatermarker is a .NET 4.5+ library for the embedding and extraction of invisible watermarks on PNG files.

It makes use of the lovely pngcs library for decoding/encoding of the PNG files, the library was written by Hernán J. González, which is available here: https://code.google.com/p/pngcs/

Features

Embed various watermarks into PNG files

Extract the watermarks at a later time

A watermarked image is almost impossible to distinguish.

Clever embedding process ensures the watermark is not stored in a sequential pattern

Watermark Types

Basic

Text Watermark Allows for the storage of a String.

File Watermark Allows for the storage of a file, preserving the original extension.

Binary Watermark Allows for the storage of binary data.



Advanced

Composite Watermark Allows for the storage of 1 to many basic watermarks as a single watermark in the image.

Encrypted Watermark Allows for the encryption and storage of any watermark (except other Encrypted Watermarks). Encryption is performed by any SymmetricAlgorithm subclass.



Examples

Text Watermark

PNGFile file = new PNGFile ( "MyOriginal.png" ); TextWatermark mark = new TextWatermark ( "This is a text based watermark" ); Watermarker . EmbedWatermark ( file , mark , "password" , "MyOutput.png" ); //Extraction file = new PNGFile ( "MyOutput.png" ); TextWatermark extract = ( TextWatermark ) Watermarker . ExtractWatermark ( file , "password" );

Composite Watermark

PNGFile file = new PNGFile ( "MyOriginal.png" ); CompositeWatermark comp = new CompositeWatermark (); FileWatermark fileMark = new FileWatermark ( "MyFile.txt" ); BinaryWatermark binMark = new BinaryWatermark ( new byte []{ 1 , 2 , 3 , 4 }); comp . AddWatermark ( fileMark ); comp . AddWatermark ( binMark ); Watermarker . EmbedWatermark ( file , comp , "password" , "MyOutput.png" ); //Extraction PNGFile file2 = new PNGFile ( "MyOutput.png" ); CompositeWatermark extract = ( CompositeWatermark ) Watermarker . ExtractWatermark ( file2 , "password" ); Watermark [] marks = extract . GetWatermarks ();

Encrypted Watermark

PNGFile file = new PNGFile ( "MyOriginal.png" ); RijndaelManaged aes = new RijndaelManaged (); aes . Padding = PaddingMode . Zeroes ; EncryptedWatermark . Algorithm = aes ; TextWatermark mark = new TextWatermark ( "This should be encrypted" ); EncryptedWatermark encrypted = new EncryptedWatermark ( mark , "super-secret" ); Watermarker . EmbedWatermark ( file , encrypted , "password" , "MyOutput.png" ); PNGFile file2 = new PNGFile ( "MyOutput.png" ); EncryptedWatermark extract = Watermarker . ExtractWatermark ( file2 , "password" ); extract . Decrypt ( "super-secret" ); Watermark decrypted = extract . DecryptedMark ;

Original File

File holding a watermark