Is it possible to make a NSBitmapImageRep with 24

2019-05-17 06:15发布

I don't understand really well the premultiplied alpha.

I need a NSBitmapImageRep without alpha channel (I don't need a particular bpp).

My problem is that this code give me errors:

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];

Error: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 24 bits/pixel; 3-component color space; kCGImageAlphaNone; 640 bytes/row.

Okay, I know this combination it's not supported but I need something like this and I don't find a solution.

2条回答
祖国的老花朵
2楼-- · 2019-05-17 07:08

Nope. The formats that Quartz supports are listed here, and like the error message you got said, 24-bit without alpha is not one of them. Since AppKit's drawing APIs are built on top of Quartz, that list applies to AppKit, too.

The best you can do is fill your context with a solid color, such as [NSColor blackColor], before you draw whatever you want to draw. You'll still have an alpha channel in the context, but no actual transparency.

查看更多
趁早两清
3楼-- · 2019-05-17 07:08

To Clarify, NSBitmapImageRep does supports 24 Bits/pixel. However, NSGraphicsContext does not support this format. Apparently an alpha channel is always required by the Quartz drawing system.

查看更多
登录 后发表回答