【问题标题】:How to create a bitmap context for an alpha mask image?如何为 alpha 蒙版图像创建位图上下文?
【发布时间】:2011-09-18 05:21:38
【问题描述】:

我想在代码中绘制一个 alpha 蒙版图像。现在我做:

1) 使用带有选项CGColorSpaceCreateDeviceRGBkCGImageAlphaPremultipliedFirstCGBitmapContextCreate 创建位图上下文。

2) 然后我在这个上下文中绘制,只使用白色和黑色等灰度颜色。

3) 然后我使用 CGImageMaskCreate 从该上下文创建蒙版图像。

结论:我浪费了很多内存!因为据我了解,蒙版图像只有灰度,对吗?那么,为什么首先要在 ARGB 中创建上下文。

如何创建用于绘制蒙版图像的 CGContextRef?我的想法是使用CGColorSpaceCreateDeviceGray,但问题从这里开始。这是我创建 ARGB 位图上下文的确切代码:

CGContextRef    context = NULL;
CGColorSpaceRef colorSpace;
uint32_t *      bitmapData;

int imageWidth = round(size.width);
int imageHeight = round(size.height);

int bitmapBytesPerRow = (imageWidth * 4);
int bitmapByteCount = (bitmapBytesPerRow * imageHeight);

colorSpace = CGColorSpaceCreateDeviceRGB();

bitmapData = malloc(bitmapByteCount);

context = CGBitmapContextCreate(bitmapData,
                                imageWidth,
                                imageHeight,
                                8,  // bits per component
                                bitmapBytesPerRow,
                                colorSpace,
                                kCGImageAlphaPremultipliedFirst);

CGColorSpaceRelease(colorSpace);

我不确定如何为这样的上下文计算 bitmapBytesPerRow。我想这只是imageWidth?我必须为CGBitmapContextCreate 中的bits per component 提供什么?

CGColorSpaceGetNumberOfComponents(),但它只报告组件的数量。这并不能告诉我一个组件有多少字节。

另外让我紧张的是48 在我上面的代码中是硬编码的。谁说每个组件总是 4 个字节,谁说每个组件是 8 位?我只是从那里的各种示例代码中获取的。每个人似乎都这样做。有用。但未来的证明?应该不会吧。

你会给我一些很棒的答案。谢谢。


编辑:我找到了一个code-sn-p,但是很混乱:

CGColorSpaceRef colorSpace2 = CGColorSpaceCreateDeviceGray();
CGContextRef gradientBitmapContext = CGBitmapContextCreate (NULL, 1, reflectRect.size.height,8, 0, colorSpace2, kCGImageAlphaNone);

为什么每行字节数为 0?文档没有说你可以通过 0。看起来不对。

【问题讨论】:

  • 您还应该使用 calloc 而不是 malloc,在创建图像之前将其清零,否则它将具有随机像素(如果您要使用颜色填充它并不重要) )。

标签: iphone objective-c quartz-graphics quartz-2d quartz-core


【解决方案1】:

这些参数告诉系统如何处理您提供的数据或内存。你自己创建了它,所以你知道你想要什么布局。系统可能想在幕后对其进行什么处理(如果有的话)并不是您的直接问题。

在这种情况下,您将为每个样本提供 8 位,只有 1 个分量,并且可能不想使用任何行填充,在这种情况下,您的 bytesPerRow 确实应该与图像宽度相同。

【讨论】:

  • 另外,为什么有些人在CGBitmapContextCreate中为bitmapBytesPerRow提供0?
  • @openfrog 行填充可用于确保数据以最佳方式对齐内存访问(例如,行不在机器字的中间开始)。在这种情况下你不应该需要它。但是某些文件格式明确要求它,所以我想如果图像上下文在加载那种数据时理解它会让生活更轻松。
  • ...关于你的第二个问题,我真的不知道。 NSBitmapImageRep 也有类似的情况,其中0 表示“您选择”,但在这种情况下,系统负责分配。这里似乎有点狡猾,但我想如果它有效(我没有测试过)它可能通过假设行没有填充来实现。
  • 实际上,该代码还为数据指针传递了NULL,这意味着函数应该自己分配内存。所以调用者不关心布局是合理的。
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2013-07-20
  • 2013-10-23
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
相关资源
最近更新 更多