2011-12-21 16 views
0

私は2d描画にGraphicsContextを使用しています。いくつかの操作では、私は個々のピクセルを編集する必要があります。しかし、何か不思議なことが起こっている、私のピクセルが保持されません必要があります。赤い矩形を半透明に描画します - 赤は1(255)に設定し、透明度を0.5(128)に設定します。後でピクセルを読み込むと、赤は128(値の半分)、アルファは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

あなたのアルファが画像にレンダリングされているときにアルファが事前に乗算されているように見えますが(理由はわかりませんが)あなたは 'CGContextBeginTransparencyLayer'を使ってアルファブレンドされたコンテンツを描画することができますが、あなたのコードはちょうどうまくいくと思っていたでしょう:( – deanWombourne

答えて

3

バイトは、より効率的なアルファブレンディングを可能にするために、プリマルチプライアルファ形式で保存されます。ここに私のコードです。 Core Graphicsを使用してカスタムビットマップコンテキストを作成することで、事前乗算されたアルファを避けることができます。 CGBitmapContextCreate、代わりにkCGImageAlphaPremultipliedLastのkCGImageAlphaLastを使用して...

しかし、それだけであらかじめ乗算アルファを使用しているとき、あなたのRGBピクセル値を保存する場合は

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

CGBitmapContextCreateでイメージを作成してその定数を設定すると、ピクセルは非プリミティブ形式で保存されますか? – MegaManX

+0

@ MegaManX:はい。 – kennytm

1

を使用して元の値を回復する方が簡単な場合がありこれらの値はすべてアルファ値以下でなければなりません。

RGBビットマップの値はバイト整数なので、丸めや量子化のために、事前に乗算された値を元に戻されていない元の値に戻して再スケーリングしようとすると、損失が生じます。

関連する問題