如何从NSBitmapImageRep
创建CGImageRef
?或者我怎样才能像NSBitmapImageRep
一样定义一个完整的新CGImageRef
?NSBitmapImageRep
的定义工作正常。但我需要一个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
];
我不知道如何从NSBitmapImageRep
创建CGImageRef
或如何定义新CGImageRef
:
CGImageRef imageRef = CGImageCreate(width, height, depth, channel*depth, channel*width, CGColorSpaceCreateDeviceRGB(), ... );
拜托,有人可以给我一个提示吗?
简单的方法是使用 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 的像素尺寸为 与接收器相同。此方法可能会返回预先存在的 CGImageRef 不透明类型或创建一个新类型。如果接收器在后面 修改后,此方法的后续调用可能会返回不同的 CGImageRef 不透明类型。
从你的代码片段来看,你似乎从一个NSData
对象开始。因此,您的问题似乎是如何从数据对象创建CGImage
。在这种情况下,没有理由通过NSBitmapImageRep
.
你几乎在那里打电话给CGImageCreate()
.你只需要弄清楚如何为它提供CGDataProvider
。您可以非常直接地从NSData
创建CGDataProvider
,一旦您意识到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);