2012-01-02 2 views
3

Я не очень хорошо понимаю премультиплексированную альфу.Возможно ли сделать NSBitmapImageRep с 24 bpp и альфа-каналом?

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

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

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

+1

Ваше использование 'saveGraphicsState' и' restoreGraphicsState' не имеет смысла: вы сохраняете в одном контексте, а затем восстанавливаете в другом контексте, не предварительно сохраняя в этом контексте. Графические состояния - это контекст, а не наоборот. –

ответ

2

Nope. The formats that Quartz supports are listed here, и, как вы сказали, сообщение об ошибке, 24-бит без альфы не является одним из них. Поскольку API-интерфейсы API AppKit построены поверх Quartz, этот список также относится к AppKit.

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

+0

Хорошо, мне действительно нужно изображение tiff без альфа-канала, это важно, потому что я использую движок OCR «_tesseract_», которому нужно изображение tiff без альфа-канала. NSImage, NSBitmapImageRep и т. Д. Все они используют альфа-канал. Тогда какое-нибудь решение для меня, пожалуйста? – PabloLerma

+0

@PabloLerma: используйте что-то другое, кроме Quartz/AppKit, чтобы сгенерировать изображение или использовать внешний инструмент для преобразования изображения в необходимый формат. –

+0

Любая идея? Я ищу о ** Magick ++ **, но я не знаю других инструментов – PabloLerma

0

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

+0

Но если NSBitmapImageRep поддерживает 24 бит/пиксель, почему я получаю ошибки? – PabloLerma

+0

Я предполагаю, что NSBitmapImageRep поддерживает 24 бит/пиксель, но NSGraphicsContext не поддерживает его (как говорится в сообщении об ошибке). –

 Смежные вопросы

  • Нет связанных вопросов^_^