如何在Swift中从NSImage创建灰度图像?

5

我创建了两个应用程序:一个是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更改为灰度?

在此输入图片描述


我已经删除了我的回答,因为它是无用的。很酷你找到了解决方案。如果你想的话,请随时发布自己的答案。 :) - Eric Aya
1个回答

5

我已经找到了一个简单的解决方案来解决我的问题。由于当它传输到我的 Mac 时已经是灰度图像,因此我可以使用下面的代码将图像表示的颜色空间转换为灰度,并将其保存为 .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)上尝试过,第一行代码实际上会将一张彩色图像转换为灰度图像。 - SteffX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接