2010-11-01 5 views
2

J'ai trouvé un peu de code comme suit:comment ajouter un filigrane sur une image exist

UIGraphicsBeginImageContext(CGSizeMake(320, 480)); 
// This is where we resize captured image 
[(UIImage *)[info objectForKey:UIImagePickerControllerOriginalImage] drawInRect:CGRectMake(0, 0, 320, 480)]; 
// And add the watermark on top of it 
[[UIImage imageNamed:@"Watermark.png"] drawAtPoint:CGPointMake(0, 0) blendMode:kCGBlendModeNormal alpha:WATERMARK_ALPHA]; 
// Save the results directly to the image view property 
imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

mais je ne suis pas sûr que ce soit la meilleure façon.

+2

Je trouve un morceau de code comme suit: – user493435

Répondre

1

Probablement la bibliothèque la plus utilisée pour ce genre de chose s'appelle Imagemagick. How to watermark.

+2

merci pour la réponse, mais si cela peut être utilisé sur iOS? – user493435

+0

Il peut, voir http://iphonesdksnippets.com/post/2010/01/29/ImageMagick-on-iPhone.aspx pour plus de détails. – OmnipotentEntity

2

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 ...

+0

Pouvez-vous expliquer/éditer le code ci-dessus pour insérer du texte de filigrane dans l'image, puis récupérer ce texte filigrané? –

+0

Pouvez-vous s'il vous plaît montrer cette méthode? createARGBBitmapContextFromImage –

+0

@KhalidUsman 'createARGBBitmapContextFromImage' fait partie de Core Graphics/Quartz 2D Framework d'Apple. Voir aussi [ici] (https://developer.apple.com/library/mac/documentation/graphicsimaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html#//apple_ref/doc/uid/TP30001066) – Constantin

1

Je ne pense pas que vous ayez besoin d'une bibliothèque pour cela. C'est trop pour une chose si simple. Au moins, la bibliothèque proposée par OmnipotentEntity est trop à mon avis.

L'approche que vous essayez est simple et bonne. Même si cela ne fonctionne pas, vous pouvez le faire vous-même. Le mélange est un algorithme très simple.

De WikiPedia:

alt text

où Co est le résultat de l'opération , Ca est la couleur du pixel dans l'élément A, Cb est la couleur de du pixel dans l'élément B, aA et aB et sont les alpha des pixels dans éléments A et B respectivement

J'allais écrire comment accéder aux pixels mais Constantin l'a déjà fait!

7

Vérifiez CGImageCreateWithMask.

image existante passer le et l'image de filigrane à cette fonction

- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { 

    CGImageRef maskRef = maskImage.CGImage; 

    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
              CGImageGetHeight(maskRef), 
             CGImageGetBitsPerComponent(maskRef), 
             CGImageGetBitsPerPixel(maskRef), 
             CGImageGetBytesPerRow(maskRef), 
             CGImageGetDataProvider(maskRef), NULL, false); 

    CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); 

    return [UIImage imageWithCGImage:masked]; 

} 
Questions connexes