CGBitmapContext获取像素值Leopard vs. SnowLeopard的混乱

时间:2009-10-16 13:32:03

标签: cocoa macos osx-snow-leopard core-graphics quartz-graphics

我试图将特定的颜色矩形绘制到CGBitmapContext中,然后将像素值与我绘制的颜色(一种命中测试)进行比较。

在Leopard上这可以正常工作但是在SnowLeopard上我输出的像素值与我绘制的颜色值不同 - 我想由于颜色空间的混淆和我的无知。

我采取的基本步骤是: -

  1. 使用kCGColorSpaceGenericRGB色彩空间
  2. 创建位图上下文
  3. 将上下文的fillColorSpace设置为相同的kCGColorSpaceGenericRGB颜色空间
  4. 设置上下文的填充颜色
  5. 绘制
  6. 获取bitmapContextData,迭代像素值等
  7. 作为一个例子,如果我这样做Leopard: -

    CGContextSetRGBFillColor(cntxt, 1.0, 0.0, 0.0, 1.0 ); // set pure red fill colour
    CGContextFillRect(cntxt, cntxtBounds); // fill entire context
    

    每个像素的值为UInt8 red == 255,green == 0,blue == 0,alpha == 255

    On Snow Lepard然而, 每个像素的值为UInt8 red == 243,green == 31,blue == 6,alpha == 255 (这些值组成了 - 我现在不是雪豹。它们大致是我所得到的 - 仍然绝对'红'但我很难与之关联(1.0,0,0)。类似于其他颜色,除了(1.0,1.0,1.0)将完全(255,255,255)和(0,0,0)将完全(0,0,0))

    我尝试了其他的colorSpaces,但发生了类似的事情。非常感谢任何帮助或指示,谢谢。

    更新 我相信这证明了我的目的......

    //create
    NSUInteger arbitraryPixSize = 10;
    size_t components = 4;
    size_t bitsPerComponent = 8;
    size_t bytesPerRow = (arbitraryPixSize * bitsPerComponent * components + 7)/8;
    size_t dataLength = bytesPerRow * arbitraryPixSize;
    UInt32 *bitmap = malloc( dataLength );
    memset( bitmap, 0, dataLength );
    
    CGColorSpaceRef colSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
    
    CGContextRef context = CGBitmapContextCreate (                                        bitmap, arbitraryPixSize, arbitraryPixSize,                                                 bitsPerComponent,bytesPerRow,                                           colSpace, kCGImageAlphaPremultipliedFirst );
    
    CGContextSetFillColorSpace( context, colSpace );
    CGContextSetStrokeColorSpace( context, colSpace );
    
    // -- draw something
    CGContextSetRGBFillColor( context, 1.0f, 0.0f, 0.0f, 1.0f );
    CGContextFillRect( context, CGRectMake( 0, 0, arbitraryPixSize, arbitraryPixSize ) );
    
    // test the first pixel
    UInt8 *baseAddr = (UInt8 *)CGBitmapContextGetData(context);
    UInt8 alpha = baseAddr[0];
    UInt8 red = baseAddr[1];
    UInt8 green = baseAddr[2];
    UInt8 blue = baseAddr[3];
    
    CGContextRelease(context);
    CGColorSpaceRelease(colSpace);
    

    结果

    Leopard - >红色== 255,绿色== 0,蓝色== 0,alpha == 255

    雪豹 - >红色== 228,绿色== 29,蓝色== 29,alpha == 255

1 个答案:

答案 0 :(得分:3)

查看CGContextSetRGBFillColor的文档。

  

CGContextSetRGBFillColor设置   当前填充颜色为中的值   DeviceRGB色彩空间。

您希望组件与通用RGB空间相关。因此,请使用其他一种设置填充颜色的方法。