在Swift中将一张图片保存在另一张图片的顶部

14

我正在学习Swift,并创建一个应用程序,使用个人照片并在其上放置另一张照片。我现在有一个笨拙的解决方案,即创建该区域的屏幕截图并保存它。我需要用Swift完成这个任务。

@IBAction func saveImage(sender: AnyObject) {
    //Create the UIImage
    UIGraphicsBeginImageContext(imageView.frame.size)
    view.layer.renderInContext(UIGraphicsGetCurrentContext())
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    //Save it to the camera roll
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}

但是,这个方法以前是有效的,现在却不行了。此外,这也不是最好的解决方案。

所以各位,我该如何将一张个人图片与一个覆盖层一起保存到相机胶卷中呢?

希望能得到帮助!谢谢!


可能是混合两个UIImages的重复问题。 - cnoon
4个回答

38

我建议阅读这个帖子。你需要的所有答案都在那里。一旦你阅读完这篇文章,以下代码示例应该能够帮助你正确地合成两张图片。

func saveImage() {
    let bottomImage = UIImage(named: "bottom")!
    let topImage = UIImage(named: "top")!

    let newSize = CGSizeMake(100, 100) // set this to what you need
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)

    bottomImage.drawInRect(CGRect(origin: CGPointZero, size: newSize))
    topImage.drawInRect(CGRect(origin: CGPointZero, size: newSize))

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
}

希望这能让你朝着正确的方向前进。


亲爱的cnoon,我不知道如何使用它,因为那是Objective C,而我需要用Swift来完成这个任务。 :( - mindfreek
1
嗨@user3528618,我更新了答案以更具体地适用于您的用例。 - cnoon

10

苹果公司建议不要使用UIGraphicsBeginImageContext,因此只要您的应用程序不支持iOS 10之前的设备,那么请使用以下方式:

private func drawLogoIn(_ image: UIImage, _ logo: UIImage, position: CGPoint) -> UIImage {
    let renderer = UIGraphicsImageRenderer(size: image.size)
    return renderer.image { context in
        image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))
        logo.draw(in: CGRect(origin: position, size: logo.size))
    }
}

除了性能提升,您可以得到完整的P3色域范围。

我的标志图像方向不正确,你能帮忙吗? - famfamfam

6

更新至 Swift 4

func saveImage() {
    let bottomImage = UIImage(named: "your bottom image name")!
    let topImage = UIImage(named: "your top image name")!            
    let newSize = CGSize(width: 100, height: 100)   // set this to what you need
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
    bottomImage.draw(in: CGRect(origin: CGPoint.zero, size: newSize))
    topImage.draw(in: CGRect(origin: CGPoint.zero, size: newSize))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
}

使用图片只需引用newImage即可。

使用图片的示例:

@IBOutlet weak var imageButton: UIButton!
imageButton.setBackgroundImage(newImage), for: .normal) 

这是cnoon的回答的修改版,但针对Swift 4进行了优化。

3

更新至Swift 3.0:

func saveImage() {
    let bottomImage = UIImage(named: "bottom")!
    let topImage = UIImage(named: "top")!

    let newSize = CGSizeMake(100, 100) // set this to what you need
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)

    bottomImage.draw(in: CGRect(origin: CGPointZero, size: newSize))//As drawInRect is deprecated
    topImage.draw(at: CGRect(origin: CGPointZero, size: newSize))//As drawInRect is deprecated

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
}

它失去了分辨率。 - Patel Jigar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接