裁剪UIImage无法获得预期的收成-快速吗?

时间:2018-09-17 13:37:22

标签: 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

2 个答案:

答案 0 :(得分:3)

核心图形坐标从左下角的原点开始,UIKit坐标从左上角开始。我认为您混淆了两者。

这可能会有所帮助:

How to compensate the flipped coordinate system of core graphics for easy drawing?

答案 1 :(得分:2)

根据要求,下面是使用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的起源是底部左,而不是 top 剩下。您需要“翻转” Y轴点。
  • UIImage的大小,而CIImage的范围。这些都是一样的。 (唯一的一次不是使用CIFIlter“创建”某些东西-颜色,平铺图像-然后是无限的。)
  • CIVector可以具有很多属性。在这种情况下,我使用X / Y签名,它是CGPoint的直接副本,只是Y轴被翻转了。
  • 我有一个使用UIImageView的{​​{3}}。请注意,模拟器的性能远不能与真实设备上的性能相提并论-我建议在涉及CoreImage的任何时候都使用设备。另外,我从输出CIImage到UIImage进行了直接转换。如果您要寻找性能,通常最好使用CIContextCoreGraphics

给出您的输入,这是输出:

sample project here