Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在NSImage上使用lockFocus时,如何强制非视网膜图像?_Swift_Macos_Cocoa - Fatal编程技术网

Swift 在NSImage上使用lockFocus时,如何强制非视网膜图像?

Swift 在NSImage上使用lockFocus时,如何强制非视网膜图像?,swift,macos,cocoa,Swift,Macos,Cocoa,我有以下代码来创建一个200x200像素的圆的图像。这不是为了在屏幕上使用,所以在锁定焦点和绘图之前,我已经手动向图像添加了一个NSBitmapImageRep let ovalSize = CGSize(width: 200, height: 200) let ovalPath = NSBezierPath(ovalIn: CGRect(origin: CGPoint.zero, size: ovalSize)) let ovalImage = NSImage(size: ovalSize)

我有以下代码来创建一个200x200像素的圆的图像。这不是为了在屏幕上使用,所以在锁定焦点和绘图之前,我已经手动向图像添加了一个NSBitmapImageRep

let ovalSize = CGSize(width: 200, height: 200)
let ovalPath = NSBezierPath(ovalIn: CGRect(origin: CGPoint.zero, size: ovalSize))
let ovalImage = NSImage(size: ovalSize)
let imageRep = NSBitmapImageRep(bitmapDataPlanes: nil, pixelsWide: 200, pixelsHigh: 200, bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: true, colorSpaceName: .deviceRGB, bitmapFormat: [.alphaFirst, .thirtyTwoBitLittleEndian], bytesPerRow: 0, bitsPerPixel: 0)
ovalImage.addRepresentation(imageRep!)
ovalImage.lockFocus()
NSColor(deviceWhite: 1, alpha: 1).setFill()
ovalPath.fill()
ovalImage.unlockFocus()
但是,如果我快速查看
ovalImage
它已以400x400渲染,并且打印
ovalImage
的表示会产生以下结果:

[<NSCGImageSnapshotRep:0x60000175bf00 cgImage=<CGImage 0x101612d30> (DP)
<<CGColorSpace 0x60000260cba0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; Color LCD)>
    width = 400, height = 400, bpc = 8, bpp = 32, row bytes = 1600 
    kCGImageAlphaPremultipliedFirst | kCGImageByteOrder32Little  | kCGImagePixelFormatPacked 
    is mask? No, has masking color? No, has soft mask? No, has matte? No, should interpolate? Yes>]
[]
lockFocus
的文档提到,如果一个表示不可用,将添加一个表示,因此我不明白为什么要替换我添加的表示

我想你需要的是

您可以这样做:

let ovalPath = NSBezierPath(ovalIn: CGRect(origin: CGPoint.zero, size: NSMakeSize(200, 200)))
let ovalImage = NSImage(size: NSMakeSize(200, 200), flipped: false) { (rect) -> Bool in
    NSColor(deviceWhite: 1, alpha: 1).setFill()
    ovalPath.fill()
    return true
}


我不知道您添加的代理被替换的原因,但您应该这样做

不是这样的答案,但您可以直接从
NSBitmapImageRep
创建
NSGraphicsContext
,将其设置为当前,并直接绘制到位图图像rep。谢谢@Kenthomass,如果需要,这似乎是一个不错的替代方法。我猜:您的屏幕是一个重设屏幕。我的提示1:尽可能避免锁定焦点/解除锁定焦点!我的提示2:照@Kenthomass说的去做,他是对的!谢谢,这里的第二个解决方案非常完美。
let ovalSize = CGSize(width: 200, height: 200)
let ovalPath = NSBezierPath(ovalIn: CGRect(origin: CGPoint.zero, size: NSMakeSize(200, 200)))
let imageRep = NSBitmapImageRep(bitmapDataPlanes: nil, pixelsWide: 200, pixelsHigh: 200, bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: true, colorSpaceName: .deviceRGB, bitmapFormat: [.alphaFirst, .thirtyTwoBitLittleEndian], bytesPerRow: 0, bitsPerPixel: 0)
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.current = NSGraphicsContext(bitmapImageRep: imageRep!)
NSColor(deviceWhite: 1, alpha: 1).setFill()
ovalPath.fill()
NSGraphicsContext.restoreGraphicsState()
let ovalImage = NSImage(size: ovalSize)
ovalImage.addRepresentation(imageRep!)