2016-02-15 29 views
3

我创建了两个应用程序:一个用于mac,一个用于iPhone。 iPhone使用MultipeerConnectivity框架将捕获的视频帧发送到Mac。我设法找到代码用于转换的UIImage使用此代码为灰度:如何在swift中从nsimage创建灰度图像?

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

+0

我已经删除了我的答案因为它没用。你找到解决方案很酷。如果你愿意,不要犹豫,自己发表一个答案。 :) – Moritz

回答

1

我已经找到了一个简单的解决我的问题。因为它已经在灰度时transimitted我的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)