首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >种植CIImage

种植CIImage
EN

Stack Overflow用户
提问于 2016-11-24 18:00:36
回答 2查看 4.1K关注 0票数 5

我有一个接受UIImage的类,用它初始化CIImage,如下所示:

代码语言:javascript
复制
workingImage = CIImage.init(image: baseImage!)

然后,该图像被用来在一个循环中以3x3模式裁剪出9个相邻的方块:

代码语言:javascript
复制
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 9IOS 10模拟器上工作,但是不能在实际的IOS 10设备上运行。所产生的图像要么都是空的,要么它们中的一个就像它应该有的一半,其余的也是空的。

难道这不是在IOS 10中应该做的吗

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-26 16:15:53

问题的核心是,通过CIImage不是UIImage的作物。首先,从CIImage回到UIImage是一项复杂的工作。其次,整个往返是没有必要的。

如何裁剪

若要裁剪图像,请生成所需裁剪大小的图像图形上下文,并在draw(at:)上调用UIImage将其绘制到相对于图形上下文的所需点,以便图像的所需部分落入上下文中。现在,提取生成的新图像并关闭上下文。

为了演示,我将裁剪到您试图裁剪到的三分之一,即右下角的第三个:

代码语言:javascript
复制
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):

其他部分完全平行。

票数 6
EN

Stack Overflow用户

发布于 2019-06-17 03:28:12

核心图像的坐标系与UIKit不匹配,因此需要镜像。

所以在你的具体情况下,你想:

代码语言:javascript
复制
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:)快得多

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40792409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档