【发布时间】:2011-09-18 05:21:38
【问题描述】:
我想在代码中绘制一个 alpha 蒙版图像。现在我做:
1) 使用带有选项CGColorSpaceCreateDeviceRGB 和kCGImageAlphaPremultipliedFirst 的CGBitmapContextCreate 创建位图上下文。
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(),但它只报告组件的数量。这并不能告诉我一个组件有多少字节。
另外让我紧张的是4 和8 在我上面的代码中是硬编码的。谁说每个组件总是 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