2011-08-11 24 views
25

Zasadniczo chcę zrobić zdjęcie wybrane przez użytkownika z jego biblioteki zdjęć, a następnie zastosować znak wodny - trójkąt w prawym dolnym rogu, zawierający nazwę aplikacji. Mam już drugi obraz z przezroczystą warstwą w Photoshopie.iPhone, jak nakłada się jeden obraz na inny, aby utworzyć nowy obraz do zapisania? (znak wodny)

Wypróbowałem funkcję, której nie pamiętam dokładnej nazwy, ale zawiera ona obiekty i maski CGII. Łączy w sobie dwa obrazy, ale jako maskę, która sprawiała, że ​​obraz był ciemniejszy tam, gdzie była przezroczysta warstwa, a obrazy nie były połączone per se, po prostu maskowane.

W jaki sposób uzyskać obraz znaku wodnego, aby scalić się z innym obrazem, aby wykonać zdjęcie UII bez wyświetlania obrazów na ekranie?

Dziękuję.

+0

możliwe duplikat [Utwórz UIImage od dwóch innych UIImages na iPhone] (http: // stackoverflow.com/questions/679245/create-a-uiimage-from-two-other-uiimages-on-the-hone) –

Odpowiedz

76

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 tła i znaku wodnego o tej samej wielkości, a następnie użyć tego kodu

... 
[backgroundImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)]; 
[watermarkImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)]; 
... 
+2

Działa doskonale! Masz rację, to było całkiem łatwe. Bardzo dziękuję za pomoc! – SolidSnake4444

+0

Lepiej używać UIGraphicsBeginImageContextWithOptions zamiast UIGraphicsBeginImageContext, aby zachować jakość obrazu na ekranach siatkówki. Zobacz http://stackoverflow.com/questions/4334233/how-to-capture-uiview-to-uiimage-without-loss-of-quality-on-retina-display, aby uzyskać więcej informacji. –

+0

Zasługujesz na ciasto! To doskonałe rozwiązanie. Mam taką samą potrzebę i zaoszczędzisz mi dużo czasu. – Jordan

1

Można użyć tej metody, która jest bardzo dynamiczny i możesz określić początkową pozycję 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; 

} 
7

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() 
Powiązane problemy