是否可以制作一个24 bpp且没有alpha通道的NSBitmapImageRep?

时间:2012-01-02 19:26:22

标签: objective-c cocoa core-graphics tiff nsbitmapimagerep

我不太了解预乘alpha。

我需要一个没有alpha通道的NSBitmapImageRep(我不需要特定的bpp)。

我的问题是这段代码给了我错误:

NSSize imageSize = NSMakeSize(200, 200);

//create a non-alpha RGB image rep with the same dimensions as the image
  NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc]
                         initWithBitmapDataPlanes:NULL
                         pixelsWide:imageSize.width
                         pixelsHigh:imageSize.height
                         bitsPerSample:8
                         samplesPerPixel:3
                         hasAlpha:NO
                         isPlanar:NO
                         bitmapFormat:NSAlphaNonpremultipliedBitmapFormat
                         bytesPerRow:(3 * imageSize.width)
                         bitsPerPixel:24];

//lock focus on the bitmap

   NSGraphicsContext *context = [NSGraphicsContext graphicsContextWithBitmapImageRep:bitmap];
   [NSGraphicsContext saveGraphicsState];
   [NSGraphicsContext setCurrentContext:context];

//draw the image into the bitmap

[prueba drawAtPoint:NSMakePoint(0, 0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:24], NSFontAttributeName, nil]];

[NSGraphicsContext restoreGraphicsState];

//get the TIFF data
   NSData* tiffData = [bitmap TIFFRepresentation];

//do something with TIFF data
   NSError *error = nil;
   [tiffData writeToFile:@"/Users/Paul/test.tif" options:NSDataWritingAtomic error:&error];
  

错误:CGBitmapContextCreate:不支持的参数组合:8个整数位/组件; 24位/像素; 3组分色彩空间; kCGImageAlphaNone; 640字节/行。

好的,我知道这个组合不受支持,但我需要这样的东西,我找不到解决方案。

2 个答案:

答案 0 :(得分:2)

不。 The formats that Quartz supports are listed here,就像你说的错误信息一样,没有alpha的24位不是其中之一。由于AppKit的绘图API是在Quartz之上构建的,因此该列表也适用于AppKit。

您可以做的最好的事情是在绘制任何想要绘制的内容之前,使用纯色(例如[NSColor blackColor])填充上下文。你在上下文中仍会有一个alpha通道,但没有实际的透明度。

答案 1 :(得分:0)

要澄清,NSBitmapImageRep支持24位/像素。但是,NSGraphicsContext不支持此格式。显然,Quartz绘图系统总是需要alpha通道。