裁剪 UIImage 未产生预期的裁剪 - swift?
Cropping UIImage not yielding expected crop - swift?
我正在尝试裁剪图像,但裁剪后未生成 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)
}
裁剪:
核心图形坐标从左下角的原点开始,UIKit 坐标从左上角开始。我认为你混淆了两者。
这可能有帮助:
How to compensate the flipped coordinate system of core graphics for easy drawing?
根据要求,这是一个使用 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
的原点在 底部 左边,而不是顶部 左侧。你需要"flip" Y轴点。
- A
UIImage
有大小,而 CIImage
有范围。这些都是一样的。 (唯一不是的情况是使用 CIFIlter 来 "create" 某些东西 - 颜色,平铺图像 - 然后它是无限的。)
- 一个
CIVector
可以有很多属性。在这种情况下,我使用 X/Y 签名,它是 CGPoint
的直接副本,只是 Y 轴被翻转了。
- 我有一个使用
UIImageView
的 sample project here。请注意,模拟器上的性能远不及真实设备上的性能——我建议在涉及 CoreImage 的任何时候使用设备。此外,我直接将输出 CIImage 转换为 UIImage。如果您正在寻找性能,通常最好使用 CIContext
和 CoreGraphics
。
根据您的输入,输出如下:
我正在尝试裁剪图像,但裁剪后未生成 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)
}
裁剪:
核心图形坐标从左下角的原点开始,UIKit 坐标从左上角开始。我认为你混淆了两者。
这可能有帮助:
How to compensate the flipped coordinate system of core graphics for easy drawing?
根据要求,这是一个使用 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
的原点在 底部 左边,而不是顶部 左侧。你需要"flip" Y轴点。 - A
UIImage
有大小,而CIImage
有范围。这些都是一样的。 (唯一不是的情况是使用 CIFIlter 来 "create" 某些东西 - 颜色,平铺图像 - 然后它是无限的。) - 一个
CIVector
可以有很多属性。在这种情况下,我使用 X/Y 签名,它是CGPoint
的直接副本,只是 Y 轴被翻转了。 - 我有一个使用
UIImageView
的 sample project here。请注意,模拟器上的性能远不及真实设备上的性能——我建议在涉及 CoreImage 的任何时候使用设备。此外,我直接将输出 CIImage 转换为 UIImage。如果您正在寻找性能,通常最好使用CIContext
和CoreGraphics
。
根据您的输入,输出如下: