我想在代码中绘制alpha蒙版图像。现在我做:
1)使用带有CGBitmapContextCreate
和CGColorSpaceCreateDeviceRGB
选项的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()
但它只报告组件数量。这并不能告诉我组件有多少字节。
让我感到紧张的是4
和8
在上面的代码中是硬编码的。谁说它每个组件总是4个字节,谁说它是每个组件8位?我刚刚从各种示例代码中取出了这个。每个人似乎都是这样做的。有用。但未来证明?可能不是。
你会用一些很好的答案来结束我的一天。感谢。
编辑:我找到了一段代码段,但令人困惑:
CGColorSpaceRef colorSpace2 = CGColorSpaceCreateDeviceGray();
CGContextRef gradientBitmapContext = CGBitmapContextCreate (NULL, 1, reflectRect.size.height,8, 0, colorSpace2, kCGImageAlphaNone);
为什么每行0字节?文档没有说你可以通过0.看起来不对。
答案 0 :(得分:1)
这些参数告诉系统如何处理您提供的数据或内存。您自己创建了这个,因此您知道您想要的布局。系统可能想要在幕后做什么,这不是你当前的问题。
在这种情况下,您将为每个样本提供8位,只有1个组件,并且可能不想使用任何行填充,在这种情况下,您的bytesPerRow
应该与图像宽度相同