我试图将特定的颜色矩形绘制到CGBitmapContext中,然后将像素值与我绘制的颜色(一种命中测试)进行比较。
在Leopard上这可以正常工作但是在SnowLeopard上我输出的像素值与我绘制的颜色值不同 - 我想由于颜色空间的混淆和我的无知。
我采取的基本步骤是: -
作为一个例子,如果我这样做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
答案 0 :(得分:3)
查看CGContextSetRGBFillColor的文档。
CGContextSetRGBFillColor设置 当前填充颜色为中的值 DeviceRGB色彩空间。
您希望组件与通用RGB空间相关。因此,请使用其他一种设置填充颜色的方法。