NSImage 是 macOS 系统中 AppKit 框架提供的一个类,用于加载、显示和操作图像资源。它在 macOS 中的角色类似于 iOS 中的 UIImage,专为 macOS 的图形处理需求设计。
核心特点
1、图像加载与显示
可以从文件、数据、系统资源或网络加载图像。
支持常见图像格式,如 PNG、JPEG、GIF、TIFF 等。
2、分辨率独立
支持 macOS 的 Retina 显示,自动选择适合分辨率的图像资源。
3、图像绘制
支持在 macOS 图形上下文(如 NSView 或 NSWindow)中绘制图像。
4、多分辨率支持
可以存储并管理不同分辨率的图像资源,以便在不同屏幕环境下使用。
创建NSImage
1、从资源名称加载(仅限 Assets 或 Bundle)
let image = NSImage(named: "example")
2、从文件路径(URL)加载图像
let image = NSImage(contentsOfFile: "/path/to/image.png")
3、从文件路径(字符串)加载图像
if let url = URL(string: "https://example.com/image.png") {
let image = NSImage(contentsOf: url)
}
4、从Data加载
if let data = try? Data(contentsOf: URL(fileURLWithPath: "/path/to/image.png")) {
let image = NSImage(data: data)
}
常用方法
1、获取图像的尺寸
let size = image.size
print("Width: \(size.width), Height: \(size.height)")
2、绘制图像
image.draw(in: NSRect(x: 0, y: 0, width: 100, height: 100))
3、保存图像到文件
func saveImage(_ image: NSImage, to url: URL) -> Bool {
guard let tiffData = image.tiffRepresentation,
let bitmap = NSBitmapImageRep(data: tiffData),
let pngData = bitmap.representation(using: .png, properties: [:]) else {
return false
}
do {
try pngData.write(to: url)
return true
} catch {
print("保存失败: \(error)")
return false
}
}
在SwiftUI中使用NSImage
let nsImage = NSImage(named: "example")!
Image(nsImage: nsImage)
注意,在SwiftUI中不要直接使用NSImage显示,因为NSImage是一个处理图片的核心类,不是显示图片的。
和SwiftUI Image转换问题
当开发SwiftUI的macOS应用时,推荐使用NSImage。
因为SwiftUI的Image类型不能直接转换为NSImage,NSImage可以转换为Image类型。
SwiftUI的Image:
let image = Image("example")
只是 UI 的描述结构(像个“图像的占位符”)。
它内部可能来自:资源名称(Image(“xxx”)),NSImage / UIImage或者CGImage,因此它就失去了图像来源的可追溯性。
所以:一旦只拿到 Image,就无法获取其像素数据、NSData、NSImage 结构。
如果,一开始就保存图片为NSImage:
let nsImage = NSImage(contentsOf: someURL)
let swiftUIImage = Image(nsImage: nsImage)
这样既可以使用Image显示,也可以使用NSImage进行保存、压缩、预览、导出等处理。
总结
NSImage 是 macOS 应用开发中用于加载和操作图像的重要类,提供了一些 macOS 特有的功能(如多分辨率支持和直接绘制功能)。
支持PDF、矢量图、Retina多分辨率图,支持多帧动画。
在SwiftUI中,需要使用Image(nsImage:)显示图片。