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

我发现CGImage.cropping(to:)将使用左上角的原点(增加Y向下)而不是左下角(随着Y向上增加)处理指定的矩形, 。这是特别奇怪的,因为CGImage默认情况下不是这样定向的,因为在应用掩码时情况并非如此。请注意,这与UIImage和方向无关 - 这是OS X特定的。CGImage.cropping(to :)在OS X上翻转

我将此作为一个问题提交,但这更多的是一个观察。 Core Graphics上的Stack Overflow上的iOS中有更多的信息比OS X更多,Apple的裁剪文档没有解释这一点。

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

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?

}

回答:

如何计算像素的doc for croppingToRect:会谈:

  • 矩形是然后用其原产地是(0,0)的矩形相交...
  • 所产生的矩形内的像素处理矩形内的第一个像素...

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

所以看起来子图像是在一种“栅格坐标空间”中计算的,而不是使用与任何其他坐标空间相对应的坐标空间元件。

以上是 CGImage.cropping(to :)在OS X上翻转 的全部内容, 来源链接: utcz.com/qa/258812.html

回到顶部