我正在使用以下代码显示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];
答案 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