Существуют различные типы водяных знаков: видимые и невидимые водяные знаки. Поскольку вы не указали явный, вам нужен видимый водяной знак, я предоставил решение для невидимого водяного знака. Теория такого рода простая: возьмите бит с наименьшим приоритетом и добавьте там водяной знак.
В программировании iPhone было бы что-то вроде этого:
CGContextRef context = [self createARGBBitmapContextFromImage:yourView.image.CGImage];
unsigned char* data = CGBitmapContextGetData (context);
size_t width = CGImageGetWidth(yourView.image.CGImage);
size_t height = CGImageGetHeight(yourView.image.CGImage);
for (int y=0; y<height; y++) {
for (int x=0; x<width; x++) {
int pos = y*width + x;
int argb = data[pos];
int r = (argb >> 16) & 0xff;
int g = (argb >> 8) & 0xff;
int b = argb & 0xff;
//add watermark to the bits with the lowest priority
unsigned char bit1 = 0x00 , bit2 = 0x01, bit3 = 0x00;
//example adds false, true, false to every pixel - only 0x00 and 0x01 should be used here (1 bit)
unsigned char mask = 0x01;
r = (r - (r & mask)) + bit1;
g = (g - (g & mask)) + bit2;
b = (b - (b & mask)) + bit3;
data[pos] = (0xFF<<24) | (r<<16) | (g<<8) | b;
}
}
Кодирование будет наоборот точно так же - можно хранить с этой шириной кода * высота * 3 Биты в изображении. То есть для изображения 640x480, которое было бы 996 байтов. . Он может хранить больше бит на пиксель, но в этом случае также будет больше деталей (тогда вам нужно изменить маску 0x01). И альфа-канал может также использоваться для хранения нескольких бит, а для простоты я оставил это здесь ...
Я нахожу кусок кода следующим образом: – user493435