Можно ли сделать NSBitmapImageRep с 24 битами на канал и без альфа-канала? - PullRequest
3 голосов
/ 02 января 2012

Я не очень хорошо понимаю предварительно умноженную альфу.

Мне нужен 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 ]

2 голосов
/ 03 января 2012

Неа. Форматы, которые поддерживает Quartz, перечислены здесь , и, подобно полученному сообщению об ошибке, 24-битный без альфа-канала не является одним из них. Поскольку API-интерфейсы рисования AppKit построены поверх Quartz, этот список применим и к AppKit.

Лучшее, что вы можете сделать, - это закрасить свой контекст сплошным цветом, например [NSColor blackColor], перед тем, как рисовать то, что вы хотите нарисовать. У вас все еще будет альфа-канал в контексте, но нет реальной прозрачности.

0 голосов
/ 03 января 2012

Чтобы уточнить, NSBitmapImageRep поддерживает 24 бит / пиксель.Однако NSGraphicsContext не поддерживает этот формат.По-видимому, альфа-канал всегда требуется для системы рисования Quartz.

...