如何为alpha蒙版图像创建位图上下文?

时间:2011-06-19 16:42:48

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

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

1)使用带有CGBitmapContextCreateCGColorSpaceCreateDeviceRGB选项的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.看起来不对。

1 个答案:

答案 0 :(得分:1)

这些参数告诉系统如何处理您提供的数据或内存。您自己创建了这个,因此您知道您想要的布局。系统可能想要在幕后做什么,这不是你当前的问题。

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