如何在 swift 中从 nsimage 创建灰度图像?

Posted

技术标签:

【中文标题】如何在 swift 中从 nsimage 创建灰度图像?【英文标题】:how to create grayscale image from nsimage in swift? 【发布时间】:2016-02-15 12:34:28 【问题描述】:

我创建了两个应用程序:一个用于 mac,一个用于 iPhone。 iPhone 使用 MultipeerConnectivity 框架将其捕获的视频帧发送到 mac。我已经设法找到使用此代码将 UIimage 转换为灰度的代码:

func convertToGrayScale(image: UIImage) -> UIImage 
        let imageRect:CGRect = CGRectMake(0, 0, image.size.width, image.size.height)
        let colorSpace = CGColorSpaceCreateDeviceGray()
        let width = image.size.width
        let height = image.size.height
        let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.None.rawValue)
        let context = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, colorSpace, bitmapInfo.rawValue)
        CGContextDrawImage(context, imageRect, image.CGImage)
        let imageRef = CGBitmapContextCreateImage(context)
        let newImage = UIImage(CGImage: imageRef!)
        return newImage
    

在下面的代码中,它将视频帧发送到 Mac:

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) 
        let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
        CVPixelBufferLockBaseAddress(imageBuffer!, kCVPixelBufferLock_ReadOnly)
        let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer!)
        let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer!)
        let width = CVPixelBufferGetWidth(imageBuffer!)
        let height = CVPixelBufferGetHeight(imageBuffer!)
        CVPixelBufferUnlockBaseAddress(imageBuffer!, 0)
        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedLast.rawValue)
        let context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, bitmapInfo.rawValue)
        let quarzImage = CGBitmapContextCreateImage(context)
        let image = UIImage(CGImage: quarzImage!)
        let grayImage = convertToGrayScale(image)
        let data: NSData = UIImagePNGRepresentation(grayImage)!
        delegate?.recievedOutput(data)
    

委托方法只是使用 session.sendData() 发送数据

所以,这里涉及到 Mac 方面。当 mac 收到 NSData 时,我从数据中创建了一个 NSImage 并使用以下代码创建了一个 .png 图像文件:

func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID) 
        let image: NSImage = NSImage(data: data)!.imageRotatedByDegreess(270)
        let cgRef = image.CGImageForProposedRect(nil, context: nil, hints: nil)
        let representation = NSBitmapImageRep(CGImage: cgRef!)
        let pngData = representation.representationUsingType(NSBitmapImageFileType.NSPNGFileType, properties: [NSImageCompressionFactor: 1.0])
        pngData?.writeToFile("/Users/JunhongXu/Desktop/image/\(result.description).png", atomically: true)
        result[4]++
        self.delegate?.presentRecievedImage(image)
    

虽然图片如下图,但当我检查我的图片文件属性时,它是RGB格式的。如何将 NSImage 的 ColorSpace 更改为灰度而不是 RGB?

enter image description here

【问题讨论】:

我已经删除了我的答案,因为它没用。很高兴您找到了解决方案。如果您愿意,请不要犹豫,自己发布答案。 :) 【参考方案1】:

我找到了解决问题的简单方法。由于它在传输到我的 Mac 时已经处于灰度状态,因此我可以使用下面的代码将图像表示的 ColorSpace 转换为灰度并将其保存为 .png 文件:

let newRep = representation.bitmapImageRepByConvertingToColorSpace(NSColorSpace.genericGrayColorSpace(), renderingIntent: NSColorRenderingIntent.Default)
let pngData = newRep!.representationUsingType(NSBitmapImageFileType.NSPNGFileType, properties: [NSImageCompressionFactor: 1.0])
pngData?.writeToFile("/Users/JunhongXu/Desktop/image/\(result.description).png", atomically: true)

【讨论】:

我在 macOS Sierra (10.12.6) 中尝试过,第一行实际上将图像转换为灰度图像,即使它是彩色的。

以上是关于如何在 swift 中从 nsimage 创建灰度图像?的主要内容,如果未能解决你的问题,请参考以下文章

Swift NSImage到CGImage

如何通过 Swift 使用 NSSlider 为 NSImage 类调整亮度?

如何在 Swift 3 中从 Base64 编码的字符串创建图像? [复制]

在 Swift、Cocoa、Mac OSX 中将 EXIF 数据设置为 NSImage

如何在 swift 中从可加载包创建主体类的实例

从像素数组问题中获取 NSImage (Swift)