2

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

CGBitmapContextCreate1) 使用with optionsCGColorSpaceCreateDeviceRGB和创建位图上下文kCGImageAlphaPremultipliedFirst

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?我必须提供bits per component什么CGBitmapContextCreate

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

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

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


编辑:我找到了一个代码片段,但它令人困惑:

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

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

4

1 回答 1

1

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

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

于 2011-06-19T17:06:41.450 回答