想知道是否有人有更好的方法作为获取一个 UIImage、对其应用 png 掩码并使用图像初始值设定项初始化 PDFPage 的解决方案。
目前正在工作的是创建两个示例 UIImageView 并使用 UIImageView.mask 属性应用蒙版,然后使用图形上下文渲染示例图像并从中读取“图像”。这似乎是一种非常老套的方法,如果能找到更好的方法就好了。
我们想要这样做的原因是我们的应用程序已经有一个文档阅读器,它具有包括某些手势在内的其他功能。看来最好的方法是回收查看器的使用,而不是重新创建另一个视图来执行完全相同的操作。
这是我尝试使用的 PDFPage 的初始化程序:
if let pdfPage = PDFPage(image: mainImage) {
let pdf = PDFDocument()
pdf.insert(pdfPage, at: 0)
return pdf.dataRepresentation()
}
- 效果很好,但本质上使用遮罩将两个图像合并在一起就是问题的根源。
let mainImage = UIImage(named: "mainImage")!
let imageView = UIImageView(image: mainImage)
let maskImage = UIImage(named: "mask")!
let maskView = UIImageView(image: maskImage)
imageView.mask = maskView
imageView.setNeedsLayout()
layoutIfNeeded()
maskView.frame = imageView.bounds
- 这是我在 CGContext 中绘制视图并从中返回位图图像的地方。
有更好的方法吗?
有很多方法可以获得您想要的结果。
可能最简单和最干净的方法是在图像中使用背景
CGImage
并使用 CGImage 函数 masking(_:)。
guard
let mainImage = UIImage(named: "mainImage"),
let maskImage = UIImage(named: "mask") else {
fatalError("Unable to load images")
}
let maskedCGImage = mainImage.cgImage.masked(maskImage.cgImage)
let maskedImage = UIImage(cgImage: maskedCGImage)
如果您想使用绘图命令创建图像,现代的方法是使用
UIGraphicsImageRenderer
。这比自己创建屏幕外 CGContext 并渲染到其中更容易、更干净。我记得,您可以使用 UIGraphicsImageRenderer
内容、UIImage
内容甚至 CGimage
s从
CALayer
获取图像