Swift中NSBitmapImageRep调用setColor方法无效果问题求助
问题原因
- 直接通过
NSBitmapImageRep(cgImage:)初始化的实例默认是只读属性,不支持像素写入操作,同时未明确配置可适配setColor接口的颜色空间参数,会触发你遇到的颜色空间报错。 - 你传入的
NSColor(cgColor: .black)!是基于CG颜色空间生成的实例,和setColor接口期望的NSColor系统颜色空间参数不兼容,也是修改不生效的原因之一。
解决方案
你需要先把原始CGImage绘制到一个显式配置了可写属性、标准RGBA颜色空间的新NSBitmapImageRep实例上,再执行像素修改操作,修正后的代码如下:
lazy var imageView:NSImageView = { let imageView = NSImageView(frame: view.frame) return imageView }() override func viewDidLoad() { super.viewDidLoad() createColorProjection() view.wantsLayer = true view.addSubview(imageView) } func createColorProjection() { let originalCGImage = cgImage! let width = originalCGImage.width let height = originalCGImage.height // 显式创建可写的、带标准RGBA颜色空间的bitmap guard let bitmap = NSBitmapImageRep( bitmapDataPlanes: nil, pixelsWide: width, pixelsHigh: height, bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: .deviceRGB, bytesPerRow: width * 4, bitsPerPixel: 32 ) else { return } // 把原始图片绘制到新的可写bitmap上 NSGraphicsContext.current = NSGraphicsContext(bitmapImageRep: bitmap) NSGraphicsContext.current?.cgContext.draw(originalCGImage, in: CGRect(x: 0, y: 0, width: width, height: height)) NSGraphicsContext.current = nil // 遍历修改像素,直接用NSColor.black不用转CGColor for x in 0..<bitmap.pixelsWide { for y in 0..<bitmap.pixelsHigh { bitmap.setColor(.black, atX: x, y: y) } } let image = createImage(bitmap: bitmap) imageView.image = image } func createImage(bitmap:NSBitmapImageRep) -> NSImage { let image = bitmap.cgImage return NSImage(cgImage: image! , size: CGSize(width: image!.width, height: image!.height)) }
验证说明
修改后运行可以看到原图被完全替换为黑色,不会再出现颜色空间相关报错,你可以替换.black为其他任意NSColor实例测试修改效果。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

