2011-03-28 87 views
1

我正在使用以下代碼來顯示32位灰度圖像。即使我明確設置每個像素爲4294967297(它應該是白色的),但最終結果始終是黑色的。我在這裏做錯了什麼?該圖像只是64x64像素。帶CGBitmapContextCreate的32位灰度圖像始終爲黑色

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

你見過支持32位浮點灰度的地方嗎?我不是說它不是..只是有興趣 – hooleyhoop 2011-03-29 22:05:21

+0

是的 - 你可以看到支持的像素格式[這裏](http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/ dq_context.html#// apple_ref/DOC/UID/TP30001066-CH203-SW9)。你需要向下滾動一下。 – saad 2011-03-29 23:23:28

+0

是的,看起來你是對的 – hooleyhoop 2011-03-30 08:31:40

回答

0

您正在使用浮動組件圖像。確保ptr輸入float *並嘗試將值設置爲0.5f而不是4294967297.

1

如果不指定字節順序,Quartz將默認爲big-endian。如果您在英特爾Mac上,這將是錯誤的。您需要明確設置的字節順序,要做到這一點的最好辦法是改變你的標誌是:(!爲未來的兼容性)

kCGImageAlphaNone | kCGBitmapFloatComponents | kCGBitmapByteOrder32Host 

這將正常工作,無論你的CPU。 你可以在這裏找到更多的細節:http://lists.apple.com/archives/Quartz-dev/2011/Dec/msg00001.html

+0

此外,數據數組中的值應該縮放到[0,1]範圍內。 – Demitri 2011-12-07 17:28:48

0

你是否顯示你正在使用的確切代碼?

2^32 - 1 = 4294967295

如果您正在使用4294967297我懷疑你得到溢出和2的實際價值!