我发现CGImage.cropping(to:)使用左上角的原点处理指定的矩形(Y向下递增),而不是左下角(Y递增向上)。这特别奇怪,因为CGImage在默认情况下不是以这种方式定位的,而且在应用掩码时也不是这样。请注意,这与UIImage和方向无关--这是特定于OS的。
我将这作为一个问题提交,但这更多的是一种观察。与OS相比,在Core Graphics的堆栈溢出中有更多关于iOS的信息,苹果的裁剪文档没有解释这一点。
下面是绘制图像的右下象限的代码,而预期的是它将绘制右上象限。
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?
}发布于 2017-12-03 08:30:26
doc for croppingToRect:谈到了像素计数:
如果W和H分别是图像的宽度和高度,则点(0,0)对应于图像数据的第一个像素。点(W-1,0)是最后一个像素...
因此,子图像似乎是在一种“光栅坐标空间”中计算的,而不是使用与任何其他元素相对应的坐标空间。
https://stackoverflow.com/questions/47613680
复制相似问题