首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGImage.cropping(to:)在OS X上翻转

CGImage.cropping(to:)在OS X上翻转
EN

Stack Overflow用户
提问于 2017-12-03 07:24:14
回答 1查看 238关注 0票数 1

我发现CGImage.cropping(to:)使用左上角的原点处理指定的矩形(Y向下递增),而不是左下角(Y递增向上)。这特别奇怪,因为CGImage在默认情况下不是以这种方式定位的,而且在应用掩码时也不是这样。请注意,这与UIImage和方向无关--这是特定于OS的。

我将这作为一个问题提交,但这更多的是一种观察。与OS相比,在Core Graphics的堆栈溢出中有更多关于iOS的信息,苹果的裁剪文档没有解释这一点。

下面是绘制图像的右下象限的代码,而预期的是它将绘制右上象限。

代码语言:javascript
复制
func getImage(_ url: CFURL) -> CGImage? {
    guard let imageSource = CGImageSourceCreateWithURL(url, nil) else { return nil }

    guard let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) else {
        let imageSourceStatus = CGImageSourceGetStatus(imageSource)
        Swift.print("image nil, Image Source Status = \(imageSourceStatus)")
        return nil
    }
    return image
}

func northeastQuadrant(fromImage: CGImage) -> CGRect {
    let w = CGFloat(fromImage.width)
    let h = CGFloat(fromImage.height)
    let bottomleft = CGPoint(x: w/2.0, y: h/2.0)
    return CGRect(x: bottomleft.x, y: bottomleft.y, width: w/2.0, height: h/2.0)
}

func southwestQuadrant(fromImage: CGImage) -> CGRect {
    let w = CGFloat(fromImage.width)
    let h = CGFloat(fromImage.height)
    return CGRect(x: 0, y: 0, width: w/2.0, height: h/2.0)
}

class CGImageView: NSView {
    func setImage() {
        let url = CFURLCreateWithString(nil, "file:////Users/erickampman/Documents/FractIFS/Demonic%20Scarecrows.tiff" as CFString, nil)

        let img = getImage(url!)
        let quad = northeastQuadrant(fromImage: img!)
//        let quad = southwestQuadrant(fromImage: img!)
        image = img!.cropping(to: quad)
    }

    override func draw(_ dirtyRect: NSRect) {
        if nil == image {
            Swift.print("Calling setImage")
            setImage()
        }

        guard let image = self.image else {
            Swift.print("Nil image!")
            return
        }
        super.draw(dirtyRect)
        guard let cgContext = NSGraphicsContext.current?.cgContext else { return }
        Swift.print("ctx transform: \(cgContext.ctm)")
        cgContext.saveGState();
        cgContext.draw(image, in: self.bounds, byTiling: false)
        cgContext.restoreGState();
    }

    var image: CGImage?
}
EN

回答 1

Stack Overflow用户

发布于 2017-12-03 08:30:26

doc for croppingToRect:谈到了像素计数:

  • 矩形然后与原点为(0,0)的矩形相交...
  • 读取结果矩形内的像素,并处理该矩形内的第一个像素...

如果W和H分别是图像的宽度和高度,则点(0,0)对应于图像数据的第一个像素。点(W-1,0)是最后一个像素...

因此,子图像似乎是在一种“光栅坐标空间”中计算的,而不是使用与任何其他元素相对应的坐标空间。

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

https://stackoverflow.com/questions/47613680

复制
相关文章

相似问题

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