2011-12-21 34 views
0

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

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]); 
} 
+1

看起来像你的alpha被渲染到图像上时被预乘(尽管我不知道为什么)。你可以尝试使用'CGContextBeginTransparencyLayer'绘制alpha混合内容,但是我认为你的代码只会工作:( – deanWombourne 2011-12-21 11:25:01

回答

3

的字节被存储在预乘alpha格式,以允许更高效的alpha混合。您可以通过Core Graphics创建自定义位图上下文来避免预乘alpha。 CGBitmapContextCreate和使用kCGImageAlphaLast代替kCGImageAlphaPremultipliedLast ...

但它可能更容易只需使用

CGFloat red = copyPixels[i+2] * 255.0f/copyPixels[i]; 
+0

因此,如果我通过CGBitmapContextCreate创建图像并设置该常量,像素应该以非预乘的格式存储? – MegaManX 2011-12-21 13:46:05

+0

@ MegaManX:是的。 – kennytm 2011-12-21 14:00:34

1

如果你想使用预乘Alpha时要保留你的RGB像素值恢复为原始值格式位图,这些值应该都小于或等于alpha值。

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