如何在Swift中裁剪UIImage?

3
我希望在Swift中编写一个函数,该函数接受图片并裁剪除中间一条细长的水平线以外的所有内容。我不想保留宽高比。
这是我目前拥有的代码,但它不能按照我的想法工作。我只想保留从y = 276到y = 299的像素。
func cropImageToBars(image: UIImage) -> UIImage {

  let rect = CGRectMake(0, 200, image.size.width, 23)

  UIGraphicsBeginImageContextWithOptions(rect.size, false, 1.0)
  image.drawInRect(rect)
  let newImage = UIGraphicsGetImageFromCurrentImageContext()
  UIGraphicsEndImageContext()

  return newImage

}

2个回答

1
您的代码是反过来的。UIImage drawInRect() 方法将整个图像绘制到目标矩形中。可以将其视为放大器或幻灯片投影机。您可以调整渲染图像的框的大小和形状。您设置了一个图像上下文,它就像一张捕捉图像一部分的胶片。
通常,您希望将图像呈现到与图像完全相同大小的矩形中,其中原点被移动,以便具有原点为0的图像上下文可以捕获所需的图像部分。
我有一个名为CropImg 的演示项目,展示了如何裁剪图像的部分。它有一个用户界面,让用户选择图像的一部分。您的情况更简单,但它应该给您一个想法。

你好,你是否考虑将你的演示项目更新至Swift 3呢?因为它目前的版本是两年前的:/ - Hayra
1
@Hayra,我刚刚更新了我的Swift 3项目,并添加了请求访问新的PHPhotoLibrary框架所需的代码和info.plist密钥。 - Duncan C

1
这个怎么样?
func cropImageToBars(image: UIImage) -> UIImage {

    let rect = CGRectMake(0, 200, image.size.width, 23)

    UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
    defer{
      UIGraphicsEndImageContext()
    }
   flipContextVertically(rect.size)

   let cgImage = CGImageCreateWithImageInRect(image.CGImage, rect)!
   return UIImage(CGImage: cgImage) 
}

func flipContextVertically(contentSize:CGSize){
    var transform = CGAffineTransformIdentity
    transform = CGAffineTransformScale(transform, 1, -1)
    transform = CGAffineTransformTranslate(transform, 0, -contentSize.height)

    CGContextConcatCTM(UIGraphicsGetCurrentContext(), transform)
}

编辑:翻转了CG坐标以匹配UIKit。


我尝试了这个,但它返回了一个错误旋转的图像。有没有办法将其旋转到原始方向? - mawnch
是的,实际上这是一个上下文坐标的变化。 - Jans
我尝试了您编辑后的回复,但图像仍然翻转,只是另一面翻转。如何将其旋转90度? - mawnch
快照会按照实际方向剪裁图像,如果您仍然看到图像方向不正确,可能是在剪裁前就是那个方向。 - Jans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接