iPhone, comment superposer une image sur une autre pour créer une nouvelle image pour la sauvegarder? (filigrane)

Fondamentalement, je veux prendre une image que l'utilisateur choisit dans sa photothèque, puis appliquer un filigrane, un triangle en bas à droite qui porte le nom de l'application. J'ai la deuxième image déjà faite avec un calque transparent dans photoshop.

J'ai essayé une fonction, dont je ne me souviens pas du nom exact, mais elle impliquait des CGIImages et des masques. Cela combine les deux images, mais comme un masque, ce qui a rendu l'image plus sombre où le calque transparent était et les images n'ont pas été fusionnées en soi, juste masqué.

Comment faire pour que l'image du filigrane fusionne avec une autre image, pour créer une UIImage, sans afficher les images à l'écran?

Je vous Remercie.

25
demandé sur SolidSnake4444 2011-08-11 06:10:41

3 réponses

C'est assez facile:

UIImage *backgroundImage = [UIImage imageNamed:@"image.png"];
UIImage *watermarkImage = [UIImage imageNamed:@"watermark.png"];

UIGraphicsBeginImageContext(backgroundImage.size);
[backgroundImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)];
[watermarkImage drawInRect:CGRectMake(backgroundImage.size.width - watermarkImage.size.width, backgroundImage.size.height - watermarkImage.size.height, watermarkImage.size.width, watermarkImage.size.height)];
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Si vous voulez que l'arrière-plan et le filigrane soient de la même taille, utilisez ce code

...
[backgroundImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)];
[watermarkImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)];
...
79
répondu omz 2016-08-08 20:05:46

La solution fournie par omz fonctionne aussi dans Swift, comme ceci:

let backgroundImage = UIImage(named: "image.png")
let watermarkImage = UIImage(named: "watermark.png")

UIGraphicsBeginImageContextWithOptions(backgroundImage.size, false, 0.0)
backgroundImage.drawInRect(CGRect(0.0, 0.0, backgroundImage.size.width, backgroundImage.size.height))
watermarkImage.drawInRect(CGRect(backgroundImage.size.width - watermarkImage.size.width, backgroundImage.size.height - watermarkImage.size.height, watermarkImage.size.width, watermarkImage.size.height))
let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
8
répondu CodeMonkey 2015-06-16 10:10:11

Vous pouvez utiliser cette méthode, qui est très dynamique et vous pouvez spécifier la position de départ de la seconde image et la taille totale de l'image.

-(UIImage *) addImageToImage:(UIImage *)img withImage2:(UIImage *)img2 andRect:(CGRect)cropRect withImageWidth:(int) width{

    CGSize size = CGSizeMake(width,40);
    UIGraphicsBeginImageContext(size);

    CGPoint pointImg1 = CGPointMake(0,0);
    [img drawAtPoint:pointImg1];

    CGPoint pointImg2 = cropRect.origin;
    [img2 drawAtPoint: pointImg2];

    UIImage* result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return result;

}
1
répondu Parvez Belim 2013-12-06 19:58:28