iPhone, jak nakładać jeden obraz na drugi, aby utworzyć nowy obraz do zapisania? (znak wodny)

Zasadniczo chcę zrobić zdjęcie, które użytkownik wybiera ze swojej biblioteki zdjęć, a następnie zastosować znak wodny, Trójkąt W prawym dolnym rogu, który ma nazwę aplikacji na nim. Mam już drugi obraz z przezroczystą warstwą w Photoshopie.

Próbowałem funkcji, której dokładnej nazwy nie pamiętam, ale dotyczyła CGIImages i masek. Łączy to dwa obrazy, ale jako maskę, która sprawiła, że obraz ciemniejszy tam, gdzie była przezroczysta warstwa, a obrazy nie zostały połączone sam w sobie, tylko zamaskowany.

Jak sprawić, aby obraz ze znakiem wodnym połączył się z innym obrazem, aby utworzyć interfejs, bez wyświetlania obrazów na ekranie?

Dziękuję.

Author: SolidSnake4444, 2011-08-11

3 answers

To całkiem proste:

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();

Jeśli chcesz, aby tło i znak wodny były tego samego rozmiaru, użyj tego kodu

...
[backgroundImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)];
[watermarkImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)];
...
 79
Author: omz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-08 20:05:46

Rozwiązanie dostarczone przez omz działa również w Swift , tak:

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
Author: CodeMonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-16 10:10:11

Możesz użyć tej metody, która jest bardzo dynamiczna i możesz określić pozycję początkową drugiego obrazu i całkowity Rozmiar obrazu.

-(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
Author: Parvez Belim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-06 19:58:28