A package for watermarking images with images with LSB. (currently only works with pngs)
var stego = require('stegomark')
stego.write("in.png", "write.png", "out.png", {
"callback": function () {
stego.read("out.png", "extracted.png")
}
})
stego.write(in_path, watermark_path, out_path[, options])
stego.read(in_path, extracted_path[, options])
callback
: to be called when the output image write is finishedsqueeze_protection
: only on write - integer - the higher this integer, the more resistance to resizing
The image watermark is rounded to 3-bit color - enough to fit in the LSBs of R, G, and B
For example, if we wanted to watermark the pixel with color FEB101 (orange) with another pixel of color FF006E (pink), the program would:
- Round the color to be watermarked Essentialy, it divides the value of each color channel by 255, rounds to the nearest integer, and reconcatenates. This process results in a 3 bit color of 100, which expanded to 24 bit is FF0000 i.e. red
- Take the 3 bit color and put it in the lowest bits of each channel of the original image. This results in a new color of FFB000 (very slightly different orange)
- Repeat for all the watermark pixels
Reading does this in reverse.
- In other LSB implementations, data stored in individual pixels is dependent on data from other pixels. However, by sacrificing color quality, we can store small, independent groups of data
- (my opinion) I like the visual system more - rather than extracting a cryptic message, one can show the message in a visual form.
The input image below:
Was watermarked with this and a squeeze protection of 5:
And created this output image:
That had this data:
I squeezed the output image in paint.net to get this:
But I was still able to extract this image: