使用 UIView 框架裁剪 UIImage
Posted
技术标签:
【中文标题】使用 UIView 框架裁剪 UIImage【英文标题】:Crop a UIImage using a UIView frame 【发布时间】:2018-03-15 22:11:32 【问题描述】:我有以下函数来裁剪 UIImage 的一部分并返回裁剪后的 UIImage。我传入 UIView 的框架,它作为一种可移动的框供用户裁剪图像。 UIView 位于 UIImage 之上,当用户按下确认时,我会尝试裁剪 UIView 下方的 UIImage 部分。
private func cropImage(image: UIImage, cropRect: CGRect) -> UIImage
UIGraphicsBeginImageContextWithOptions(cropRect.size, false, 0)
image.draw(at:CGPoint(x: -cropRect.origin.x, y: -cropRect.origin.y))
let croppedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return croppedImage!;
@IBAction func confirmTapped(_ sender: UIButton)
let croppedImage = cropImage(image: backgroundImage!, cropRect: mediaView.frame)
我正在使用相机框架获取原始 UIImage,值得注意的是我的手机在拍照时处于纵向模式:
let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer!)
let dataProvider = CGDataProvider(data: imageData as CFData)
let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.defaultIntent)
let image = UIImage(cgImage: cgImageRef!, scale: 1.0, orientation: self.getImageOrientation(forCamera: self.currentCamera))
问题我遇到的问题是裁剪后的 UIImage 被放大/放大,并且不代表 UIView 框架下方/内部的实际区域。
【问题讨论】:
【参考方案1】:尝试将屏幕比例作为参数传递?
let image = UIImage(cgImage: cgImageRef!, scale: UIScreen.main.scale, orientation: self.getImageOrientation(forCamera: self.currentCamera))
也将比例添加到 UIGraphicsBeginImageContext:
UIGraphicsBeginImageContextWithOptions(cropRect.size, false, UIScreen.mainScreen.scale)
【讨论】:
这个还是不行 这是因为您传递的是帧而不是像素大小。当您裁剪图像时,您需要像素高度和宽度以上是关于使用 UIView 框架裁剪 UIImage的主要内容,如果未能解决你的问题,请参考以下文章
是否可以将带有大框架的uiview添加到带有小框架的uiview中
将 UIView.layer.clipsToBounds = true 与 CABasicAnimation 结合使用时,并非所有像素都被裁剪