web-dev-qa-db-fra.com

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

En gros, je veux prendre une image que l'utilisateur choisit dans sa photothèque, puis appliquer un filigrane, un triangle en bas à droite portant le nom de l'application. La deuxième image est déjà faite avec un calque transparent dans Photoshop.

J'ai essayé une fonction dont je ne me souviens plus du nom exact, mais qui impliquait des masques et des images CGII. Cela combine les deux images, mais en tant que masque, ce qui rend l'image plus sombre, là où se trouve le calque transparent, et les images ne sont pas fusionnées en soi, mais masquées.

Comment pourrais-je faire en sorte que l'image en filigrane se confonde avec une autre image pour créer un UIImage sans afficher les images à l'écran?

Je vous remercie.

26
SolidSnake4444

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 le fond et le filigrane aient 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)];
...
81
omz

La solution fournie par omz fonctionne également dans Swift , comme suit:

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()
11
CodeMonkey

Swift 4

                    let backgroundImage = imageData!
                    let watermarkImage = #imageLiteral(resourceName: "jodi_url_icon")

                    UIGraphicsBeginImageContextWithOptions(backgroundImage.size, false, 0.0)
                    backgroundImage.draw(in: CGRect(x: 0.0, y: 0.0, width: backgroundImage.size.width, height: backgroundImage.size.height))
                    watermarkImage.draw(in: CGRect(x: 10, y: 10, width: watermarkImage.size.width, height: backgroundImage.size.height - 40))

                    let result = UIGraphicsGetImageFromCurrentImageContext()
                    UIGraphicsEndImageContext()
                    self.imgaeView.image = result

Utiliser le résultat dans UIImageView, testé.

1
Sachin Rasane

Vous pouvez utiliser cette méthode, qui est très dynamique et vous pouvez spécifier la position de départ de la deuxième 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
Parvez Belim