我正在尝试实现一个在 UIImageView 的特定点绘制图像的功能。
1.) 所以用户拍了一张照片 2.) 照片在“Aspect Fit”中的 UIImageView 中显示给用户 3.) 用户单击 UIImageView 将图像放置在点击点处 4.) 显示组合图像
代码:
extension UIImage {
func image(byDrawingImage image: UIImage, inRect rect: CGRect) -> UIImage! {
UIGraphicsBeginImageContextWithOptions(size, false, 0)
draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
image.draw(in: rect)
let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return result
}}
@IBAction func imageTapped(_ sender: UITapGestureRecognizer) {
let pointTapped = sender.location(in: imageDIsplay)
imageDIsplay.image = originalImage?.image(byDrawingImage: #imageLiteral(resourceName: "checkmark.png"), inRect: CGRect(x: originalImage!.size.width / imageDIsplay.frame.width * pointTapped.x, y: originalImage!.size.height / imageDIsplay.frame.height * pointTapped.y, width: 100, height: 100))
}
我的问题:“复选标记图像”从未位于我单击的确切位置。
我尝试了很多而不是originalImage!.size.width/imageDIsplay.frame.width
以获得更好的比例,包括CGRect AVMakeRectWithAspectRatioInsideRect(CGSizespectRatio, CGRectboundingRect);
。但没有任何东西能正常工作。
我错过了什么?
谢谢! 莎拉
最佳答案
您绝对走在正确的道路上。手头有一个可用的utility会很有用。当图像以“宽高比”内容模式显示时,将 ImageView 边界中的点转换为图像边界中的点:
extension UIImageView {
func convertPointToImageCoordinates(_ p:CGPoint) -> CGPoint {
switch self.contentMode {
case .scaleAspectFit:
let r = AVMakeRect(
aspectRatio: self.image!.size, insideRect: self.bounds)
let scale = self.image!.size.width / r.width
var p2 = CGPoint(x: p.x - r.minX, y: p.y - r.minY)
p2 = CGPoint(x: p2.x * scale, y: p2.y * scale)
return p2
default:
fatalError("not written")
}
}
}
现在您可以获得相对于原始图像的点击坐标,因此您可以决定相对于该坐标放置复选标记图像的位置。
关于ios - 在 UIImage 上绘制另一个图像 -,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50785064/