我有一个 ImageView 定义为:
@IBOutlet weak var imgView: NSImageView!
写入的图像数据定义为:
var imageData = [[Int?]](
repeating: [Int?](repeating: nil, count: 256),
count: 240
)
我正在从计时器调用 onDraw 方法。绘制耗时最长的核心部分是:
let image = NSImage(size: NSSize(width: 240, height: 256))
image.lockFocus()
for y in 0..<240 {
for x in 0..<256 {
let n = imageData[y][x]
let scaledY = 255 - y
let c = NSColor(red: CGFloat(((n! & 0xFF000000) >> 24)) / 255.0, green: CGFloat((n! & 0x00FF0000) >> 16) / 255.0, blue: CGFloat((n! & 0x0000FF00) >> 8) / 255.0, alpha: 1.0)
c.drawSwatch(in: NSRect(x: x, y: scaledY, width: 1, height: 1))
}
}
image.unlockFocus()
imgView.image = image
我尝试更改计时器速度,但绘图部分似乎花费了太长的时间。尝试达到 30 FPS,但由于绘制图像数据需要时间,最终会跳帧。
注释掉 NSColor 对象和 c.drawSwatch 的创建,它运行得非常快。但显然什么也没画。
那么有没有更快的方法来绘制 NSImage 呢?抱歉,我对 Swift 和 Cocoa 开发还很陌生。
最佳答案
很难从你的问题中准确说出你想要做什么。
我的猜测是你应该create a CGImage
from a data provider with the proper bitmap metadata然后create an NSImage
from that 。如果您想要缩放,请不要在创建CGImage
时尝试这样做。只需尽可能直接地向其提供原始图像数据即可。稍后,在从中创建 NSImage
时指定大小。
无论如何,请避免重新创建这些图像对象,除非底层图像数据已更改。例如,不要在每次要求 View 自行绘制时重新创建图像。
关于swift - 有没有更快的方法在 MacOS Cocoa swift 应用程序中绘制 NSImage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57764795/