在 UIImage 上绘制另一个图像 -

Draw another image on a UIImage -

我正在尝试实现在 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
}}

source

    @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))

}

我的问题:"checkmark Image" 从来没有在我点击的确切位置。

我尝试了很多而不是 originalImage!.size.width / imageDIsplay.frame.width 以获得更好的比率,包括 CGRect AVMakeRectWithAspectRatioInsideRect(CGSize aspectRatio, CGRect boundingRect);。但没有任何工作正常。

我错过了什么?

谢谢! 莎拉

您绝对是在正确的轨道上。当图像以 "aspect fit" 内容模式显示时,手头有一个工作 utility 用于将图像视图边界中的点转换为图像边界中的点会很有用:

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")
        }
    }
}

现在您可以获得相对于原始图像的点击坐标,因此您可以决定将复选标记图像相对于该图像放置在何处。