如何从NSBitmapImageRep创建CGImageRef?

时间:2014-12-10 09:55:23

标签: objective-c cgimageref nsbitmapimagerep

如何从CGImageRef创建NSBitmapImageRep? 或者,如何以与CGImageRef相同的方式定义完整的新NSBitmapImageRepNSBitmapImageRep的定义很好。但我需要一张CGImageRef的图像。

unsigned char *plane = (unsigned char *)[data bytes]; // data = 3 bytes for each RGB pixel

NSBitmapImageRep* imageRep = [[NSBitmapImageRep alloc]
                              initWithBitmapDataPlanes:     &plane
                              pixelsWide:                   width
                              pixelsHigh:                   height
                              bitsPerSample:                depth
                              samplesPerPixel:              channel
                              hasAlpha: NO
                              isPlanar: NO
                              colorSpaceName: NSCalibratedRGBColorSpace
                              //bitmapFormat: NSAlphaFirstBitmapFormat
                              bytesPerRow:                  channel * width
                              bitsPerPixel:                 channel * depth
                             ];

我不知道如何从CGImageRef创建NSBitmapImageRep或如何定义新的CGImageRef

CGImageRef imageRef = CGImageCreate(width, height, depth, channel*depth, channel*width, CGColorSpaceCreateDeviceRGB(), ... );

拜托,有人可以给我一个暗示吗?

2 个答案:

答案 0 :(得分:3)

简单的方法是使用CGImage属性(在10.5中引入):

CGImageRef image = imageRep.CGImage;

文档:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSBitmapImageRep_Class/index.html#//apple_ref/occ/instm/NSBitmapImageRep/CGImage

  

返回值

     

返回基于的自动释放的CGImageRef opaque类型   接收者的当前位图数据。

     

<强>讨论

     

返回的CGImageRef具有的像素尺寸   与接收器相同。此方法可能会返回预先存在的   CGImageRef opaque类型或创建一个新类型。如果接收器是晚些时候   修改后,此方法的后续调用可能会返回不同的内容   CGImageRef不透明类型。

答案 1 :(得分:0)

从您的代码段开始,您似乎开始使用NSData对象。所以,您的问题似乎是如何从数据对象创建CGImage。在这种情况下,没有理由通过NSBitmapImageRep

你几乎在那里打电话给CGImageCreate()。您只需要弄清楚如何为其提供CGDataProvider。一旦您意识到CGDataProviderNSData的免费桥接,您就可以直接从NSData创建CFData。所以:

CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGImageRef image = CGImageCreate(width, height, depth / 3, depth, channel*width, colorspace, kCGImageAlphaNone, provider, NULL, TRUE, kCGRenderingIntentDefault);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorspace);