我有一个接受UIImage的类,用它初始化CIImage,如下所示:
workingImage = CIImage.init(image: baseImage!)然后,该图像被用来在一个循环中以3x3模式裁剪出9个相邻的方块:
for x in 0..<3
{
for y in 0..<3
{
croppingRect = CGRect(x: CGFloat(Double(x) * sideLength + startPointX),
y: CGFloat(Double(y) * sideLength + startPointY),
width: CGFloat(sideLength),
height: CGFloat(sideLength))
let tmpImg = (workingImage?.cropping(to: croppingRect))!
}
}这些tmpImgs被插入到表中并在以后使用,但这并不是重点所在。
这段代码可以在IOS 9和IOS 10模拟器上工作,但是不能在实际的IOS 10设备上运行。所产生的图像要么都是空的,要么它们中的一个就像它应该有的一半,其余的也是空的。
难道这不是在IOS 10中应该做的吗
发布于 2016-11-26 16:15:53
问题的核心是,通过CIImage不是UIImage的作物。首先,从CIImage回到UIImage是一项复杂的工作。其次,整个往返是没有必要的。
如何裁剪
若要裁剪图像,请生成所需裁剪大小的图像图形上下文,并在draw(at:)上调用UIImage将其绘制到相对于图形上下文的所需点,以便图像的所需部分落入上下文中。现在,提取生成的新图像并关闭上下文。
为了演示,我将裁剪到您试图裁剪到的三分之一,即右下角的第三个:
let sz = baseImage.size
UIGraphicsBeginImageContextWithOptions(
CGSize(width:sz.width/3.0, height:sz.height/3.0),
false, 0)
baseImage.draw(at:CGPoint(x: -sz.width/3.0*2.0, y: -sz.height/3.0*2.0))
let tmpImg = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()原始图像(baseImage):

裁剪图像(tmpImg):

其他部分完全平行。
发布于 2019-06-17 03:28:12
核心图像的坐标系与UIKit不匹配,因此需要镜像。
所以在你的具体情况下,你想:
var ciRect = croppingRect
ciRect.origin.y = workingImage!.extent.height - ciRect.origin.y - ciRect.height
let tmpImg = workingImage!.cropped(to: ciRect)这无疑适用于iOS 10+。
在更一般的情况下,我们将做一个UIImage扩展,它涵盖两个可能的坐标系统,而且比draw(at:)快得多
extension UIImage {
/// Return a new image cropped to a rectangle.
/// - parameter rect:
/// The rectangle to crop.
open func cropped(to rect: CGRect) -> UIImage {
// a UIImage is either initialized using a CGImage, a CIImage, or nothing
if let cgImage = self.cgImage {
// CGImage.cropping(to:) is magnitudes faster than UIImage.draw(at:)
if let cgCroppedImage = cgImage.cropping(to: rect) {
return UIImage(cgImage: cgCroppedImage)
} else {
return UIImage()
}
}
if let ciImage = self.ciImage {
// Core Image's coordinate system mismatch with UIKit, so rect needs to be mirrored.
var ciRect = rect
ciRect.origin.y = ciImage.extent.height - ciRect.origin.y - ciRect.height
let ciCroppedImage = ciImage.cropped(to: ciRect)
return UIImage(ciImage: ciCroppedImage)
}
return self
}
}我已经为它做了一个吊舱,所以源代码在https://github.com/Coeur/ImageEffects/blob/master/SwiftImageEffects/ImageEffects%2Bextensions.swift
https://stackoverflow.com/questions/40792409
复制相似问题