在 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")
}
}
}
现在您可以获得相对于原始图像的点击坐标,因此您可以决定将复选标记图像相对于该图像放置在何处。
我正在尝试实现在 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")
}
}
}
现在您可以获得相对于原始图像的点击坐标,因此您可以决定将复选标记图像相对于该图像放置在何处。