如何在swift中使用cropping(to:)方法?

Posted

技术标签:

【中文标题】如何在swift中使用cropping(to:)方法?【英文标题】:How to use cropping(to:) method in swift? 【发布时间】:2020-09-10 18:44:47 【问题描述】:

我需要将图像的中心部分裁剪为高 200 宽 250 的矩形。没有滚动视图。

在我找到的所有解决方案中,都有一个类似的计算,

let scale = image.size.width / imageView.frame.width

然后将矩形的x、y、高度和宽度与比例相乘,然后将其传递给cropping(to:)方法,该方法会将矩形从UIKit坐标转换为核心图形坐标。

我的问题是,在进行这些转换并将其转换为 UIImage 之后,裁剪区域不是预期的。

我也试过了,

let scale = max(image.size.width / imageView.frame.width, image.size.height / imageView.frame.height)

生成的裁剪区域在 x 和 y 轴上仍然偏离了大约 100 个点。我在这里想念什么?是否需要额外计算?

【问题讨论】:

你想缩放图像吗?或者只是从图像中心剪出一个 250x200 的矩形? 是的,只需要从中心剪切矩形,同时保持图像的比例和方向相同。 【参考方案1】:

这里有一组很好的UIImage 扩展函数:https://***.com/a/28513086/6257435

将此添加到该扩展程序以从中心剪切 clipSize 的矩形:

func clipFromCenter(clipSize: CGSize) -> UIImage? 
    var r: CGRect = CGRect(origin: .zero, size: clipSize)
    r.origin.x = (size.width - clipSize.width) * 0.5
    r.origin.y = (size.height - clipSize.height) * 0.5
    return cropped(to: r)

所以...

if let img = UIImage(named: "bkg") 
    if let centerImg = img.clipFromCenter(clipSize: CGSize(width: 250, height: 200))
        // do what you want with the new UIImage
    

【讨论】:

@sanjay - 不...如果您查看我链接的答案,您会发现它正在使用UIGraphicsImageRenderer 似乎链接的答案期望将边界转换为核心图形坐标,这实际上是我面临的麻烦。如果我传入 rect.frame,它会裁剪图像的其他部分。 @sanjay - 这令人困惑......你为什么要在任何地方传递rect.frame?你有一个UIImage,并且你想要它的中心250x200 部分。你在说什么frame 我指的是链接的答案。该方法需要一个 CGRect 作为参数。根据您发布的答案,我假设 clipFromCenter 函数应该是 UIImage 的扩展。但是,cropped(to:) 是一种 CIImage 方法。我尝试在裁剪之前同时转换为 CGImage 和 CIImage,但两者都没有给出正确的裁剪图像。 @sanjay - 这是一个完整的实现:pastebin.com/wi4qymkz .. 我没有在我的答案中发布所有代码,因为它不是我的代码并且已经在 Stack Overflow 上作为答案存在.

以上是关于如何在swift中使用cropping(to:)方法?的主要内容,如果未能解决你的问题,请参考以下文章

图像大小警告以及 django-image-cropping 中的裁剪字段意味着啥

为啥 cgImage?.cropping 会旋转图像?

Swift3,如何在不同的 viewController 中使用相同的 UITableView

python使用openCV把原始彩色图像转化为灰度图使用矩阵索引的方式对数据数据进行剪裁(image cropping)

如何在swift中实现多播套接字?

如何在 Swift 中获取两个日期之间的天数? [复制]