2つの画像を重ねようとしています。下の画像は、画像ライブラリから、アルファが 1.0 に設定された UIImageView オブジェクトに読み込まれます。この画像のすべてのピクセルのアルファ値も 1.0 です。コンテキストで作成している 2 番目の画像。この画像のアルファ値は、ピクセルごとに異なります。コンテキストで 2 番目の画像を作成した後、最初の UIImageView の上に表示される 2 番目の UIImageView にそれを描画します。この 2 番目の UIImageView にも 1.0 に設定されたアルファがあります。両方の UIImageView の background プロパティが clear に設定されています。
実行時にスライダーを使用して 2 番目の画像のピクセルの個々のアルファ値を変更しようとしていますが、2 番目の画像の RGB 値を 1 番目の画像と適切にブレンドすることができません。明度、暗度などに基づいてブレンドしたくありません。kCGBlendModeCopy が必要なようですが、これはまだ明度またはその他のパラメーターに基づいてブレンドしているようです。
問題を視覚化するために: 一番下の UIImageView が人の写真だと想像してください。私のトップ UIImageView は、2 つの塗りつぶされた円で構成されています。赤1本と緑1本。スライダーを使用して、赤のピクセルのアルファ値を 0.0 から 1.0 に変更すると、赤い円が真っ赤にフェードインし、スムーズに完全にフェードアウトします。
RGB データ配列の値をアルファ値と等しくなるように設定し、アルファ値を 1.0 に設定することで、アルファ値が正しく機能していることを確認できます。これは、黒い円が白にフェードアウトして戻ってくることを示しています。
最初の画像にオーバーレイされる 2 番目の画像を作成するために使用しているコードは次のとおりです。
//image <-- is the name of the second UIImageView that's passed to this method
//rgbaDataNew <-- is the name of my pixel data array for the second image
CGContextRef context;
CGImageRef imageRef;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
context = CGBitmapContextCreate(rgbaDataNew, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
imageRef = CGBitmapContextCreateImage (context);
UIImage * topImage = [UIImage imageWithCGImage:imageRef];
CGContextSetBlendMode(context, kCGBlendModeCopy);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), [topImage CGImage]);
image.image = [UIImage imageWithCGImage:CGBitmapContextCreateImage (context)];
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
CGImageRelease(imageRef);