Существуют различные типы водяных знаков: видимые и невидимые водяные знаки. Поскольку вы не упомянули явно, что вы хотите видимый водяной знак, я предоставлю решение для невидимого водяного знака. Теория этого типа проста: возьмите биты с самым низким приоритетом и добавьте туда свой водяной знак.
В программировании на 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). И альфа-канал также может быть использован для хранения нескольких битов - для простоты я оставил это здесь ...