2012-04-21 7 views

答えて

4

Multiply is(Adobeが呼んでいるものです)ブレンドモードです。ブレンドモードは基本的には数式を使用したピクセル演算です。 2つのイメージを一緒にブレンドすることも、1つを使用して「自己ブレンド」することもできます。

これは、画像をピクセル単位で処理したり、特定のピクセルの各チャネル値を取得して処理したりすることで実現できます。

残念ながら、私はMagickライブラリに精通していません。ただし、チャネル値(赤、緑または青、0〜255)を指定すると、乗算演算の結果値が返される式があります。ここ

unsigned char result = a * b/255;

注結果が1つのバイトよりも大きくすることになるので、a、bはまた、他のオーバーフローが発生する可能性があります符号なし文字でなければなりません。これは基本的な乗算式です。より大きな可変サイズを割り当て、除数を適切に変更することによって、チャネルごとに16ビットをサポートするように変数を適合させることができます。

8

あなたがこれを行う簡単な方法をしたい場合は、私のGPUImageフレームワークは、2枚の画像を取り込んで、各画素毎に、赤、緑、青、およびアルファチャネル別の乗算を行い、そのGPUImageMultiplyBlendFilterを、持っています。 GPUで高速化するので、CPUで同じ操作を実行するよりも4〜6倍高速になります。

これを使用するには、ブレンドして、あなたの2枚の画像を設定する:

UIImage *inputImage1 = [UIImage imageNamed:@"image1.jpg"];  
GPUImagePicture *stillImageSource1 = [[GPUImagePicture alloc] initWithImage:inputImage1]; 

UIImage *inputImage2 = [UIImage imageNamed:@"image2.jpg"];  
GPUImagePicture *stillImageSource2 = [[GPUImagePicture alloc] initWithImage:inputImage2]; 

、あなたのブレンドフィルタを作成および構成:

UIImage *filteredImage = [blendFilter imageFromCurrentlyProcessedOutput]; 

GPUImageMultiplyBlendFilter *blendFilter = [[GPUImageMultiplyBlendFilter alloc] init]; 
[inputImage1 processImage]; 
[inputImage1 addTarget:blendFilter]; 
[inputImage2 addTarget:blendFilter]; 
[inputImage2 processImage]; 

、最終的にブレンドされた画像の結果を抽出

現在の実装では、iPad 2より古いデバイスにはlimがあります2048x2048を超える画像は、今の古いデバイスでは処理できません。私はそれを修正するために取り組んでいます。

+0

Brad Larson great answer! :)でも、ライブラリを使って色合いを適用できますか? – janusbalatbat

+1

@janusfidel - 露出、ゲイン、または明るさの調整から、カラーコンポーネントの1つの値をシフトし、カラーマトリックスを適用することに、イメージのカラー内容を変更するいくつかの異なる方法があります。後者は、画像に対してセピア調を行うために使用される。それ以外にも、ちょうどあなたが望む効果を出すために、Cのような少量のコードで新しいフィルターを書くのは簡単です。 –

+0

@ブラッド・ラーソンさん、ありがとうございます。それは多くの助けとなりました。 – janusbalatbat

0

Brad Larsonコードを再利用すると、うまく機能しました。

UIImage *inputImage1 = [UIImage imageNamed:@"image1.jpg"]; 
GPUImagePicture *stillImageSource1 = [[GPUImagePicture alloc] initWithImage:inputImage1]; 

UIImage *inputImage2 = [UIImage imageNamed:@"sample.jpg"]; 
GPUImagePicture *stillImageSource2 = [[GPUImagePicture alloc] initWithImage:inputImage2]; 

GPUImageMultiplyBlendFilter *blendFilter = [[GPUImageMultiplyBlendFilter alloc] init]; 
[stillImageSource1 processImage]; 
[stillImageSource1 addTarget:blendFilter]; 
[stillImageSource2 addTarget:blendFilter]; 
[stillImageSource2 processImage]; 

[blendFilter useNextFrameForImageCapture]; 

UIImage *filteredImage = [blendFilter imageFromCurrentFramebuffer]; 

[self.imageView setImage:filteredImage]; 
関連する問題