从 Swift 中的自定义相机拍摄后裁剪图像

Posted

技术标签:

【中文标题】从 Swift 中的自定义相机拍摄后裁剪图像【英文标题】:Crop Image after taking from custom camera in Swift 【发布时间】:2017-11-15 12:27:53 【问题描述】:

我有自定义相机视图,除此之外,我有指南我想将拍摄的照片裁剪到该指南,当我得到不同部分的裁剪图像时,我想获得指南内的区域。

func imageByCropToRect(rect:CGRect, scale:Bool) -> UIImage 

    var rect = rect
    var scaleFactor: CGFloat = 1.0
    if scale  
        scaleFactor = self.scale
        rect.origin.x *= scaleFactor
        rect.origin.y *= scaleFactor
        rect.size.width *= scaleFactor
        rect.size.height *= scaleFactor
    

    var image: UIImage? = nil;
    if rect.size.width > 0 && rect.size.height > 0 
        let imageRef = self.cgImage!.cropping(to: rect)
        image = UIImage(cgImage: imageRef!, scale: scaleFactor, orientation: self.imageOrientation)
    

    return image!



if let image = self.getImageFromSampleBuffer(buffer: sampleBuffer, orientation: orientation) 
let newImage = image.imageByCropToRect(rect: self.guideImageView.frame, scale: true)
selectedPropertyImage = newImage
stopCaptureSession()

【问题讨论】:

请问您找到解决方案了吗? 【参考方案1】:

您必须使用 captureDevicePointConverted 将当前视图层的坐标映射到相机预览层。例如:

    let previewImageLayerBounds = previewLayer.bounds
    let originalWidth = original.size.width
    let originalHeight = original.size.height

    let A = previewImageLayerBounds.origin
    let B = CGPoint(x: previewImageLayerBounds.size.width, y: previewImageLayerBounds.origin.y)
    let D = CGPoint(x: previewImageLayerBounds.size.width, y: previewImageLayerBounds.size.height)

    let a = previewLayer.captureDevicePointConverted(fromLayerPoint: A)
    let b = previewLayer.captureDevicePointConverted(fromLayerPoint: B)
    let d = previewLayer.captureDevicePointConverted(fromLayerPoint: D)

    let posX = floor(b.x * originalHeight)
    let posY = floor(b.y * originalWidth)

    let width: CGFloat = d.x * originalHeight - b.x * originalHeight
    let height: CGFloat = a.y * originalWidth - b.y * originalWidth

    let cropRect = CGRect(x: posX, y: posY, width: width, height: height)

【讨论】:

以上是关于从 Swift 中的自定义相机拍摄后裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

UIImagePickerController 中的自定义裁剪大小

带有 UIImagePickerController 和 AVFoundation 的自定义相机

是否可以自定义 android 的相机裁剪意图视图?

如何在 Android 中使用自定义文件名保存相机拍摄的图像?

将相机捕获的图像保存到ios中的文档目录中[重复]

Android 上的自定义裁剪