CoreGraphicsコンテキスト(iPhone、にObjC)における透明度/アルファ
-
26-09-2019 - |
質問
私は現在、iphoneのための基本的な画像編集ソフトを作っています。
私はCGImageRef
からUIImage
を取ると、それは次のコード
origImage = result.CGImage;
Iheight = CGImageGetHeight(origImage);
Iwidth = CGImageGetWidth(origImage);
IcolorSpace = CGColorSpaceCreateDeviceRGB();
IrawData = malloc(Iheight * Iwidth * 4);
IbytesPerPixel = 4;
IbytesPerRow = IbytesPerPixel * Iwidth;
IbitsPerComponent = 8;
Icontext = CGBitmapContextCreate(IrawData, Iwidth, Iheight, IbitsPerComponent,
IbytesPerRow, IcolorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big
);
//[bytesPerRow release];
CGContextSetBlendMode(Icontext, kCGBlendModeCopy);
CGContextDrawImage(Icontext, CGRectMake(0,0,Iwidth,Iheight), origImage);
I次に画素をループ
for (int x=0; x<Iwidth; x++) {
for (int y=0; y<Iheight; y++) {
//and set the alpha component to 0
int byteIndex = (y*IbytesPerRow) + x*IbytesPerPixel;
IrawData[byteIndex+3] = 0;
}
}
その後、と
で、コンテキストからCGImageRefを作成します CGImageRef imagea = CGBitmapContextCreateImage(Icontext);
とA UIImageView
にUIImageと割り当てることCGImageを追加の問題はアルファの変化は、得られる画像に影響されないことであるの
私はピクセルの色を変更した場合
IrawData[byteIndex+(0/1/2)]
色の変化が、の私はまだピクセルのアルファを変更することはできませんの
ありがとう、
nonono
解決
DOはその後、アルファを変更する前に色をunpremultiplyすることを忘れ、再プリマルチプライ彼らではない。
プリマルチプライ色(しばしば誤解されている「あらかじめ乗算アルファ」と呼ばれる)の色成分が合成容易にするために、既にアルファで乗算格納されていることを意味します。通常の合成(ソースオーバー)このような動作になります。
result = (source.rgb * source.a) + (destination.rgb * (1.0 - destination.a));
:それはスキップすることができますので、最初の乗算がすでに行われていることプリマルチプライ手段
result = source.rgb + (destination.rgb * (1.0 - destination.a));
あなたが積算済みの色成分を変更することなく、アルファを変更すると、結果が変化し、時にしないあなたは、画像を描画色がまだ古いアルファによってあらかじめ乗算されているので、それは、全く異なるように見えるしません。
だから、あなたは(それが掛けられた以前のように、あなたが今、逆の操作を行う必要がありますので、)あなたがアルファを変更-beforeで、アルファによって一つ一つを分割し、その色-をunpremultiplyする必要があります。その後、新しいアルファによって、プリマルチプライ色のアルファを変更した後
もちろん、ゼロにアルファを変更する場合、すべての色が黒くなると、この手段(R = G = B = 0)。だから、ユーザーが戻ってそれを変更したい場合があります場合は、元のイメージを維持することを確認します。
これは、ユーザーが望んでいるものは何でもアルファで(任意のアルファなしでそれに加えられた変更)は、おそらく、より有効であろう、と確かに容易になるだろう、だけで元の画像を描画します。あなたは<のhref =「https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextSetAlpha」のrel =でこれを行うことができます「nofollowをnoreferrer」>あなたがイメージを描画する前に、表示コンテキストのグローバルアルファを変えます。