macOS位图类NSBitmapImageRep
macOS位图类NSBitmapImageRep

macOS位图类NSBitmapImageRep

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/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注