Il existe différents types de tatouage: le filigrane visible et non visible. Parce que vous n'avez pas mentionné explicitement que vous voulez un filigrane visible, je vais fournir une solution pour un filigrane non visible. La théorie de ce genre de simple: Prenez les bits avec la priorité la plus basse et ajoutez votre filigrane là.
Dans la programmation iPhone ce serait quelque chose comme ceci:
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;
}
}
L'encodage serait exactement le même vice-versa - vous pouvez stocker avec cette largeur de code * hauteur * 3 bits dans l'image. C'est à dire. pour une image 640x480 qui serait 996 octets Il peut stocker plus de bits par pixel, mais perdra également plus de détails dans ce cas (alors vous devez changer le masque 0x01). Et le canal alpha pourrait aussi être utilisé pour stocker quelques bits - pour plus de simplicité je l'ai laissé ici ...
Je trouve un morceau de code comme suit: – user493435