objective-ccocoacore-graphicstiffnsbitmapimagerep

Is it possible to make a NSBitmapImageRep with 24 bpp and no alpha channel?


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.


Solution

  • 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.