NSBitmapImageRep 是 macOS 中用于表示位图图像数据(Bitmap Image Data)的类,属于 AppKit 框架的一部分。它是 NSImageRep 的子类,专门用于处理像素级别的图像内容,比如 JPEG、PNG、TIFF 的原始像素数据。
NSImage 是一个“图像容器”,可以包含多个 NSImageRep 表示方式。
而 NSBitmapImageRep 就是其中一种位图表示方式,它承载了实际的像素数据。

常用初始化方法
// 从 NSImage 创建 BitmapImageRep
let image = NSImage(named: "example")!
if let tiffData = image.tiffRepresentation,
let bitmap = NSBitmapImageRep(data: tiffData) {
// 使用 bitmap
}
从NSImage创建BitmapImageRep。
常用属性和方法
1、pixelsWide / pixelsHigh:图像的宽度/高度(像素)。
2、size:图像的尺寸(点,非像素)。
3、colorSpaceName:色彩空间(如 .deviceRGB)。
4、samplesPerPixel:每像素的采样数量(RGB 是 3,RGBA 是 4)。
5、bitmapData:指向原始像素数据的指针。
6、representation(using:properties:):编码为 PNG/JPEG 的 Data。
典型用途
1、将 NSImage 转换为 PNG/JPEG 等格式的 Data(比如用于保存文件或上传)。
2、从原始 Data 创建图像(比如从本地磁盘或网络加载图片)。
3、访问、操作图像的像素、分辨率、位深等底层信息。
4、执行图像编码(压缩)与解码操作。
使用场景
1、将NSImage转换为PNG的Data:
// NSImage 转换为 pngData
if let tiffData = image.tiffRepresentation,
let bitmap = NSBitmapImageRep(data: tiffData),
let pngData = bitmap.representation(using: .png, properties: [:]) {
// 保存或上传 pngData
}
2、PNG的Data反向创建NSImage:
if let bitmap = NSBitmapImageRep(data: imageData) {
let nsImage = NSImage(size: bitmap.size)
nsImage.addRepresentation(bitmap)
}
3、将PNG保存到磁盘
func saveAsPNG(image: NSImage, to url: URL) {
guard let tiff = image.tiffRepresentation,
let bitmap = NSBitmapImageRep(data: tiff),
let pngData = bitmap.representation(using: .png, properties: [:]) else {
print("转换失败")
return
}
do {
try pngData.write(to: url)
print("保存成功")
} catch {
print("写入失败: \(error)")
}
}
压缩图片
1、支持的压缩类型
NSBitmapImageRep 可以将图像编码为以下格式:
1、PNG:.png,无损压缩(不可设置压缩率)。
2、JPEG:.jpeg,支持压缩率设置(最常用)。
3、JPEG 2000:.jpeg2000,支持压缩率。
4、TIFF:.tiff,一般无压缩。
5、GIF:.gif,不建议使用。
6、BMP:.bmp,不建议使用。
7、HEIC(某些版本支持):.heic(macOS 10.13+,需额外配置),支持压缩率(但兼容性差)。
2、压缩场景
1、压缩为JPEG(设置压缩率)
func compressImage(_ nsImage: NSImage, compressionFactor: CGFloat = 0.5) -> Data? {
guard let tiffData = nsImage.tiffRepresentation,
let bitmap = NSBitmapImageRep(data: tiffData) else {
return nil
}
let properties: [NSBitmapImageRep.PropertyKey: Any] = [
.compressionFactor: compressionFactor // 范围 0.0(最小质量)到 1.0(最大质量)
]
return bitmap.representation(using: .jpeg, properties: properties)
}
2、保存压缩图像到磁盘
func saveCompressedImage(_ image: NSImage, to url: URL, compression: CGFloat) {
if let data = compressImage(image, compressionFactor: compression) {
do {
try data.write(to: url)
print("成功保存压缩图片到 \(url.path)")
} catch {
print("写入失败:\(error)")
}
} else {
print("压缩失败")
}
}
3、读取、压缩和保存图片
let inputURL = URL(fileURLWithPath: "/Users/you/Desktop/input.jpg")
let outputURL = URL(fileURLWithPath: "/Users/you/Desktop/output.jpg")
if let nsImage = NSImage(contentsOf: inputURL) {
saveCompressedImage(nsImage, to: outputURL, compression: 0.3)
}
3、压缩率与文件大小关系
1、1.0:文件最大,画质最清晰。
2、0.8:文件较大,画质几乎无损。
3、0.5:文件中等,推荐值。
4、0.3:文件较小,有轻微模糊。
5、0.1:文件最小,明显模糊,最省空间。
4、压缩注意事项
PNG 是无损格式,不支持 .compressionFactor,即使设置也无效。
如果想压缩为 PNG 且减少文件大小,可以考虑:减少像素尺寸(缩放)和减少色彩位数。
.jpeg2000 支持更强的压缩,但兼容性不如 .jpeg,建议用于内部用途。
如果希望显示压缩前后的图片体积(文件大小),可以用:
let beforeSize = try? FileManager.default.attributesOfItem(atPath: originalURL.path)[.size]
let afterSize = compressedData.count // 或保存后的 URL 获取
总结
NSImage是“高层容器”,它可能包含多个表示(@2x、PDF、矢量图、bitmap 等)。
NSBitmapImageRep 才是真正的“像素数据”,用于压缩、编码、处理等底层操作。
所有想要“保存”、“压缩”、“获取宽高尺寸(像素)”、“转换格式”的地方,几乎都要用它。
经过实际测试:发现NSBitmapImageRep只有压缩jpg或jpeg图片,可以实现很好的压缩。
1、JPG和JPEG格式,最低可以压缩 65% 。
2、EXR格式,可以压缩60%。
3、PNG格式,最低可以压缩35%。
4、GIF格式,只能压缩成单图。
5、HEIC格式和WEBP格式会反向压缩让图片变得更大。
6、TIFF格式,输出原图。

如果想要压缩HEIC和EXR,可以使用《Apple压缩图片类CGGImageDestination》,其他的压缩和NSBitmapImageRep没有什么区别。
相关文章
1、macOS图像基类NSImageRep:https://fangjunyu.com/2025/07/09/macos%e5%9b%be%e5%83%8f%e5%9f%ba%e7%b1%bbnsimagerep/
2、MacOS图像显示类NSImage:https://fangjunyu.com/2024/11/22/macos%e5%9b%be%e5%83%8f%e6%98%be%e7%a4%ba%e7%b1%bbnsimage/
3、Apple压缩图片类CGGImageDestination:https://fangjunyu.com/2025/07/13/apple%e5%8e%8b%e7%bc%a9%e5%9b%be%e7%89%87%e7%b1%bbcgimagedestination/