在UIImage上绘制另一个图像 –

我正在尝试实现一个在UIImageView的特定点绘制图像的function。

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(CGSize aspectRatio, CGRect boundingRect); 。 但没有什么能正常工作

我错过了什么?

谢谢! 莎拉

你肯定是在正确的轨道上。 当图像以“宽高比适合”内容模式显示时,有一个工作实用程序可用于将图像视图边界中的点转换为图像边界中的点:

 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: px - r.minX, y: py - r.minY) p2 = CGPoint(x: p2.x * scale, y: p2.y * scale) return p2 default: fatalError("not written") } } } 

现在,您可以获得相对于原始图像的点击坐标,这样您就可以决定将复选标记图像放在哪里。