gpt4 book ai didi

uiimageview - 如何在 swift 4 或更高版本中裁剪具有可选区域的图像?

转载 作者:行者123 更新时间:2023-12-04 01:15:42 24 4
gpt4 key购买 nike

我需要一些关于我想在我的应用中实现的功能的帮助。我在 Aspect Fit 中有一个带有内容模式的 ImageView 的 View 。当我从我的库中获取图像时,我想用可调整的矩形裁剪一个区域,创建一个新图像。我一直在寻找一些示例或在线教程,但没有成功。任何人都可以帮助我吗?这是我的 View 中的图像。

This is my view in the Storyboard .

And here is my view in Simulator

最佳答案

简单的解决方案是在特定的 CGRect 内渲染 ImageView :

func snapshot(in imageView: UIImageView, rect: CGRect) -> UIImage {
return UIGraphicsImageRenderer(bounds: rect).image { _ in
imageView.drawHierarchy(in: imageView.bounds, afterScreenUpdates: true)
}
}

这种方法的局限性在于,如果图像的分辨率比 ImageView 可以渲染的分辨率高很多(当我们使用“纵横比拟合”时经常出现这种情况),您将失去这种额外的精度。

如果你想保持分辨率,你应该将CGRect转换为与图像的坐标,在这种情况下,假设“aspect scale fit”(即居中并缩放,使整个图像显示):

func snapshot(in imageView: UIImageView, rect: CGRect) -> UIImage {
assert(imageView.contentMode == .scaleAspectFit)

let image = imageView.image!

// figure out what the scale is

let imageRatio = imageView.bounds.width / imageView.bounds.height
let imageViewRatio = image.size.width / image.size.height

let scale: CGFloat
if imageRatio > imageViewRatio {
scale = image.size.height / imageView.bounds.height
} else {
scale = image.size.width / imageView.bounds.width
}

// convert the `rect` into coordinates within the image, itself

let size = rect.size * scale
let origin = CGPoint(x: image.size.width / 2 - (imageView.bounds.midX - rect.minX) * scale,
y: image.size.height / 2 - (imageView.bounds.midY - rect.minY) * scale)
let scaledRect = CGRect(origin: origin, size: size)

// now render the image and grab the appropriate rectangle within
// the image’s coordinate system

let format = UIGraphicsImageRendererFormat()
format.scale = image.scale
format.opaque = false

return UIGraphicsImageRenderer(bounds: scaledRect, format: format).image { _ in
image.draw(at: .zero)
}
}

使用这个扩展:

extension CGSize {
static func * (lhs: CGSize, rhs: CGFloat) -> CGSize {
return CGSize(width: lhs.width * rhs, height: lhs.height * rhs)
}
}

产生:

enter image description here

关于uiimageview - 如何在 swift 4 或更高版本中裁剪具有可选区域的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54179704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com