0

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);
4

1 に答える 1

0

私は少し異なる方法でこの問題に取り組みますが、Quartz の作業を少し行う必要があります。

UIView サブクラスを作成し、最初の imageView をプロパティとして追加し、その他の値をいくつか追加して、オーバーレイで何をしたいかを定義します。

サブクラスの drawRect で、最初に UIImageView の - (void)drawInRect:(CGRect)rect メソッドを使用して画像を描画します。

その後、クォーツを使用して、イメージ上にオブジェクトを正確に描画できます (フレーム、色、不透明度などを提供するビューのプロパティを使用)。Quartz を使用したサンプル コードを簡単に見つけることができます。

あるいは、本当に 2 番目の imageView を使用したい場合は、下のビューを描画した後、2 番目のビューの - (void)drawInRect:(CGRect)rect blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha メソッドを使用して、重ねます。

どちらの場合も、UIView サブクラスを使用します。

于 2012-07-15T14:53:44.420 に答える