是否可以制作一个 24 bpp 且没有 alpha 通道的 NSBitmapImageRep?

Posted

技术标签:

【中文标题】是否可以制作一个 24 bpp 且没有 alpha 通道的 NSBitmapImageRep?【英文标题】:Is it possible to make a NSBitmapImageRep with 24 bpp and no alpha channel? 【发布时间】:2012-01-02 19:26:21 【问题描述】:

我不太了解预乘 alpha。

我需要一个没有 alpha 通道的 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 位/像素;三分量色彩空间; kCGImageAlphaNone; 640 字节/行。

好的,我知道这种组合不受支持,但我需要这样的组合,但我没有找到解决方案。

【问题讨论】:

您对saveGraphicsStaterestoreGraphicsState 的使用没有意义:您在一个上下文中保存,然后在另一个上下文中恢复,而之前没有保存在该上下文中。图形状态是每个上下文的,而不是相反。 【参考方案1】:

不。 The formats that Quartz supports are listed here,就像您收到的错误消息一样,没有 alpha 的 24 位不是其中之一。由于 AppKit 的绘图 API 是在 Quartz 之上构建的,因此该列表也适用于 AppKit。

您可以做的最好的事情是在绘制任何您想绘制的东西之前用纯色填充您的上下文,例如[NSColor blackColor]。上下文中仍然有一个 Alpha 通道,但没有实际的透明度。

【讨论】:

好的,我真的需要一个没有 alpha 通道的 tiff 图像,这很重要,因为我使用了一个 OCR 引擎“tesseract”,它需要一个没有 alpha 通道的 tiff 图像。 NSImage、NSBitmapImageRep 等。它们都使用 alpha 通道。那么,请问有什么解决办法吗? @PabloLerma:使用 Quartz/AppKit 以外的东西来生成图像,或者使用外部工具将图像转换为所需的格式。 有什么想法吗?我正在搜索 Magick++ 但我不知道其他工具【参考方案2】:

为了澄清,NSBitmapImageRep 确实支持 24 位/像素。但是,NSGraphicsContext 不支持这种格式。显然,Quartz 绘图系统始终需要 Alpha 通道。

【讨论】:

但是,如果 NSBitmapImageRep 支持 24 位/像素,为什么会出现错误? 我猜 NSBitmapImageRep 支持 24 位/像素,但 NSGraphicsContext 不支持(如错误消息所述)。

以上是关于是否可以制作一个 24 bpp 且没有 alpha 通道的 NSBitmapImageRep?的主要内容,如果未能解决你的问题,请参考以下文章

RGB888与RGB565互相转换原理

从 24bpp 位图中获取每个像素的 RGB 值,以便在 C 中转换为 GBA 格式

LCD编程_使用调色板

1bpp 单色 BMP

加载具有一定分辨率的游标

如何使用 vImageMatrixMultiply 将 YUV 平面数据转换为 32 bpp、8bpc RGBX?