iPhone RGBA值未正确保存

时间:2011-12-21 11:04:09

标签: iphone drawing quartz-graphics pixel

我正在使用GraphicsContext进行2D绘图。对于某些操作,我需要编辑单个像素。但是,发生了一些奇怪的事情,我的像素并没有按照它们应该保留。我绘制红色矩形,半透明 - 红色设置为1(255),透明度设置为0.5(128)。当我稍后读取像素时 - 红色现在是128(其值的一半),而alpha是128(这是正确的)。我想稍后找到值为255的所有红色像素,并更改它们,但这是不可能的,因为它们不保留设定值。这是我的代码:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(widthT, heightT), NO, 1);
CGContextRef contextRef = UIGraphicsGetCurrentContext();
//CGContextSaveGState(contextRef);
CGContextSetRGBFillColor(contextRef, 1, 0, 0, 0.5);
CGContextSetRGBStrokeColor(contextRef, 1, 0, 0, 0.5);
CGContextFillRect(contextRef, CGRectMake(0, 0, 400, 400));

UIImage *imageMoonMask = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//NSData *data = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));

NSData *data = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(imageMoonMask.CGImage));

Byte *copyPixels = (Byte *)[data bytes];
pixels = (Byte *) malloc([data length] * sizeof (Byte));

for(int i = 0; i < [data length]; i += 4) {
    pixels[i] = copyPixels[i];
    pixels[i+1] = copyPixels[i+1];
    pixels[i+2] = copyPixels[i+2]; //red color
    pixels[i+3] = copyPixels[i+3]; //alpha
    NSLog(@"Originalni");
    NSLog(@"%u", pixels[i]);
    NSLog(@"%u", pixels[i+1]);
    NSLog(@"%u", pixels[i+2]);
    NSLog(@"%u", pixels[i+3]);
}

2 个答案:

答案 0 :(得分:3)

字节以预乘alpha 格式存储,以实现更高效的Alpha混合。您可以通过Core Graphics创建自定义位图上下文来避免预乘alpha。 CGBitmapContextCreate并使用kCGImageAlphaLast而不是kCGImageAlphaPremultipliedLast ...

但仅使用

恢复原始值可能更容易
CGFloat red = copyPixels[i+2] * 255.0f / copyPixels[i];

答案 1 :(得分:1)

如果您希望在使用预乘的alpha格式位图时保留RGB像素值,则这些值应该都小于或等于alpha值。

由于您的RGB位图值是字节整数,因为舍入或量化,尝试将预乘值重新缩放回非预乘的原始值将是有损的。