带有CGBitmapContextCreate的32位灰度图像始终为黑色

时间:2011-03-28 20:37:11

标签: cocoa core-graphics quartz-2d

我正在使用以下代码显示32位灰度图像。即使我明确地将每个像素设置为4294967297(应该是白色),最终结果总是黑色。我在这做错了什么?图像只有64x64像素。

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
ptr = (float*)malloc(4*xDim*yDim);
for(i=0;i<yDim;i++)
{
    for(j=0;j<xDim;j++)
    {
        ptr[i*xDim + j] = 4294967297;
    }
}
CGContextRef bitmapContext = CGBitmapContextCreate(
                                                   ptr,
                                                   xDim,
                                                   yDim,
                                                   32,
                                                   4*xDim,
                                                   colorSpace,
                                                   kCGImageAlphaNone | kCGBitmapFloatComponents);

//ptr = CGBitmapContextGetData(bitmapContext);


//NSLog(@"%ld",sizeof(float));

CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext);

NSRect drawRect;
drawRect.origin = NSMakePoint(1.0, 1.0);
drawRect.size.width = 64;
drawRect.size.height = 64;
NSImage *greyscale = [[NSImage alloc] initWithCGImage:cgImage size:NSZeroSize];
[greyscale drawInRect:drawRect
             fromRect:NSZeroRect
            operation:NSCompositeSourceOver
             fraction:1.0];

4 个答案:

答案 0 :(得分:1)

如果您没有指定字节序,Quartz将默认为big-endian。如果您使用的是Intel Mac,那就错了。您需要显式设置字节序,最好的方法是将标志更改为:

kCGImageAlphaNone | kCGBitmapFloatComponents | kCGBitmapByteOrder32Host

无论您的CPU如何,这都能正常工作(以便将来兼容!)。 您可以在此处找到更多详细信息:http://lists.apple.com/archives/Quartz-dev/2011/Dec/msg00001.html

答案 1 :(得分:0)

您正在使用浮动组件图像。确保ptr的类型为float *,并尝试将值设置为0.5f而不是4294967297。

答案 2 :(得分:0)

您是否正在显示您正在使用的确切代码?

2 ^ 32 - 1 = 4294967295

如果您使用的是4294967297,我怀疑您的溢出和实际值为2!

答案 3 :(得分:0)

CGBitmapContextCreate不支持32位浮点灰度。 CGBitmapContextCreate Supported Color Spaces