在Swift中合并2个图像,而不会丢失原始图像的大小
我试图合并2个图像,而不会丢失原始图像的大小。 我有一个大的白色图像,我想合并一个较小的图像。 如果我移动较小的图像,使其只显示在较大图像的顶部,那么当我合并这两个图像时,只有所显示图像的一半应该合并,而另一面应该被裁剪掉。
下面的图像的层次结构
UIView:剪辑子视图被选中
—->用白色图像的UIImageView
—-> UIImageView:这个图像有一个平移手势,允许它在视图内移动。
我发现这篇文章迅速合并了两个不同的图像,并试图掩盖图像
let maskedImage: UIImage = self.maskImage(imageView.image!, withMask: whiteImage.image!) newImageView.image = maskedImage
但是这并不考虑图像视图中图像当前位置。 它只是返回原始图像(然后resize以适应UIIMageView,这就是为什么它比以前大一点)
有谁知道我怎么能合并这两个图像,并考虑到合并时的位置? 理想情况下,第二个图像看起来像第一个图像,除了这是一个单一的图像,而不是两个。
一个合理的技术,会给你想要的结果将是
- 排列你想“合并”到UIView的图像。
- 拍摄该UIView的图像快照。
我喜欢在UIView上创build扩展,这将快照一个图像(如果你愿意的话,可以拍一个屏幕截图)。 从而:-
import UIKit extension UIView { func capture() -> UIImage { UIGraphicsBeginImageContextWithOptions(self.frame.size, self.opaque, UIScreen.mainScreen().scale) self.layer.renderInContext(UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } }
一旦你的图像(作为子视图)包含在一个单一的视图,你可以。
let mergedImage = containerUIView.capture()
更新达摩的Swift 3.x的答案
extension UIView { func capture() -> UIImage { UIGraphicsBeginImageContextWithOptions(self.frame.size, self.isOpaque, UIScreen.main.scale) self.layer.render(in: UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image! } }