Можно ли создать NSBitmapImageRep с 24 битами на пиксель и без альфа-канала?

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

Мне нужен 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 байт / строка.

Хорошо, я знаю, что эта комбинация не поддерживается, но мне нужно что-то вроде этого, и я не нахожу решения.


person PabloLerma    schedule 02.01.2012    source источник
comment
Использование saveGraphicsState и restoreGraphicsState не имеет смысла: вы сохраняете в одном контексте, а затем восстанавливаете в другом контексте без предварительного сохранения в этом контексте. Состояния графики зависят от контекста, а не наоборот.   -  person Peter Hosey    schedule 03.01.2012


Ответы (2)


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

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

person Peter Hosey    schedule 02.01.2012
comment
Хорошо, мне действительно нужно изображение в формате TIFF без альфа-канала, это важно, потому что я использую механизм распознавания текста tesseract, которому требуется изображение в формате TIFF без альфа-канала. NSImage, NSBitmapImageRep и т. Д. Все они используют альфа-канал. Тогда какое решение для меня, пожалуйста? - person PabloLerma; 03.01.2012
comment
@PabloLerma: используйте что-то другое, кроме Quartz / AppKit, для создания изображения или используйте внешний инструмент для преобразования изображения в нужный формат. - person Peter Hosey; 03.01.2012
comment
Любая идея? Я ищу по теме Magick ++, но не знаю других инструментов - person PabloLerma; 04.01.2012

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

person Jim Merkel    schedule 02.01.2012
comment
Но тогда, если NSBitmapImageRep поддерживает 24 бит / пиксель, почему я получаю ошибки? - person PabloLerma; 03.01.2012
comment
Я предполагаю, что NSBitmapImageRep поддерживает 24 бит / пиксель, но NSGraphicsContext не поддерживает его (как говорится в сообщении об ошибке). - person Jim Merkel; 03.01.2012