iPhone, как можно наложить одно изображение на другое, чтобы создать новое изображение для сохранения? (Водяной знак)

В основном я хочу взять изображение, которое пользователь выбирает из своей библиотеки фотографий, а затем применить водяной знак, треугольник в правом нижнем углу, на котором есть название приложения. У меня уже есть второе изображение с прозрачным слоем в фотошопе.

Я попробовал функцию, которую я не помню точное имя, но она включала в себя CGIImages и маски. Это объединяет два изображения, но в качестве маски, которая сделала изображение темнее там, где был прозрачный слой, и изображения не были объединены как таковые, а просто замаскированы.

Как заставить изображение водяного знака слиться с другим изображением, создать UIImage без отображения изображений на экране?

Спасибо.

3 ответа

Решение

Это довольно просто:

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

Если вы хотите, чтобы фон и водяной знак были одинакового размера, используйте этот код

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

Решение, предоставляемое omz, также работает в Swift, вот так:

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

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

Используйте результат для UIImageView, протестировано.

Вы можете использовать этот метод, который очень динамичен, и вы можете указать начальную позицию второго изображения и общий размер изображения.

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

}

SWIFT 5 Функция:

func addWaterMark(image: UIImage) -> UIImage {
        let backgroundImage = image//UIImage(named: "image.png")
        let watermarkImage = UIImage(named: "waterMark.png")

        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: backgroundImage.size.width - watermarkImage!.size.width, y: backgroundImage.size.height - watermarkImage!.size.height, width: watermarkImage!.size.width, height: watermarkImage!.size.height))
        let result = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return result!
    }
Другие вопросы по тегам