2011-12-21 68 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位圖值是字節整數,因四捨五入或量化原因,嘗試將預乘的值重新縮放回非預乘原始值將是有損的。