ios - 裁剪 UIImage 没有产生预期的裁剪 - swift ?

标签 ios swift core-image

我正在尝试裁剪图像,但裁剪后未生成 UIImage 的预期部分。图像出现方向错误和镜像。这非常令人困惑。

 @IBOutlet weak var imgPreViewOutlet: UIImageView!

 guard
        let cgImage = self.imgPreViewOutlet.image.cgImage else {return}


// NORMALISE COORDINATES
let topXn = TOP_LEFT.x/screenWidth
let topYn = TOP_LEFT.y/screenHeight
let widthn = (TOP_RIGHT.x - TOP_LEFT.x)/screenWidth
let heightn = (BOTTOM_RIGHT.y - TOP_RIGHT.y)/screenHeight


// DIMENSION OF CGIMAGE
let cgImgWidth = cgImage.width
let cgImgHeight = cgImage.height

let cropRect = CGRect.init(x: topXn * CGFloat.init(widthn) , y: topYn * CGFloat.init(heightn), width: widthn * CGFloat.init(cgImgWidth), height: heightn * CGFloat.init(cgImgHeight))

if let cgCropImged = cgImage.cropping(to: cropRect){

        print("cropRect: \(cropRect)")

        self.imgPreViewOutlet.image = UIImage.init(cgImage: cgCropImged)
    }

enter image description here

裁剪:

enter image description here

最佳答案

根据要求,这里有一个使用 CIPerspectiveCorrection 裁剪图像的示例。我下载并使用 Sketch 获取示例图像中 4 个 CGPoints 的近似值。

    let inputBottomLeft = CIVector(x: 38, y: 122)
    let inputTopLeft = CIVector(x: 68, y: 236)
    let inputTopRight = CIVector(x: 146, y: 231)
    let inputBottomRight = CIVector(x: 151, y: 96)

    let filter = CIFilter(name: "CIPerspectiveCorrection")
    filter?.setValue(inputTopLeft, forKey: "inputTopLeft")
    filter?.setValue(inputTopRight, forKey: "inputTopRight")
    filter?.setValue(inputBottomLeft, forKey: "inputBottomLeft")
    filter?.setValue(inputBottomRight, forKey: "inputBottomRight")

    filter?.setValue(ciOriginal, forKey: "inputImage")
    let ciOutput = filter?.outputImage

请注意以下几点:

  • 永远不要忘记 CoreImage 的最重要的事情是 CIImage 的原点在底部左边,而不是顶部 离开了。您需要“翻转”Y 轴点。
  • UIImage 有大小,而 CIImage 有范围。这些都是一样的。 (唯一不是的情况是使用 CIFILter 来“创建”某些东西 - 颜色、平铺图像 - 然后它是无限的。)
  • CIVector 可以有很多属性。在这种情况下,我使用 X/Y 签名,它是 CGPoint 的直接副本,只是 Y 轴被翻转了。
  • 我有一个 sample project here使用 UIImageView。请注意,模拟器上的性能远不及真实设备上的性能——我建议在涉及 CoreImage 的任何时候使用设备。此外,我直接将输出 CIImage 转换为 UIImage。如果您正在寻找性能,通常最好使用 CIContextCoreGraphics

根据您的输入,输出如下:

enter image description here

关于ios - 裁剪 UIImage 没有产生预期的裁剪 - swift ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52369076/

相关文章:

ios - 在 Swift 中登录后滑动返回手势

ios - CIfilter中过滤值的最佳范围

swift - 如何合并图像以用形状填充其他图像?

ios - 将平移手势识别器限制为特定圆圈

ios - 在 Swift 中使用 isKindOf

ios - 使用 GDB 测试 iPad 应用程序挂起黑屏,在模拟器上正常

ios - 静止图像上带有动画的运动/移动效果

ios - 在 OSX 上查看文档集

ios - 滚动到顶部加载更多

ios - UIImageView 溢出 Collection View 单元格