2012-04-21 64 views

回答

4

乘法是一個(Adobe稱爲)混合模式。混合模式本質上是使用一些數學公式的像素操作。你可以將兩個圖像混合在一起,或者你可以使用一個,從而產生「自我混合」。

這可以通過對像素逐像素進行操作,獲取特定像素的每個通道值並對其進行處理來實現。

不幸的是,我不熟悉Magick庫。但是,這是一個給定通道值(紅色,綠色或藍色,0 - 255)將返回乘法運算結果值的公式。

unsigned char result = a * b/255;

注意這裏,A和B也必須是無符號的字符,則可能會出現其他的溢出,因爲結果會比一個字節大。這是基本的乘法公式,您可以通過分配更大的變量大小並適當修改除數來調整變量以支持每通道16位。

8

如果你想要一個簡單的方法來做到這一點,我GPUImage框架有其GPUImageMultiplyBlendFilter,它有兩個圖像,並進行紅,綠,藍,alpha通道,由通道倍增每個像素。它是以GPU加速的方式實現的,因此它可以比在CPU上執行相同的操作快4-6倍。

要使用此功能,設置你的兩個圖像融合:

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

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

然後創建和配置混合濾波器:

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

,最後提取混合後的圖像結果:

UIImage *filteredImage = [blendFilter imageFromCurrentlyProcessedOutput]; 

在目前的實施中有一點需要注意的是,比iPad 2更老的設備有限制提高了紋理尺寸,因此現在無法在這些較舊的設備上處理大於2048x2048的圖像。我正在解決這個問題。

+0

Brad Larson很好的答案! :)但你也可以使用圖庫應用色調? – janusbalatbat 2012-05-17 05:00:32

+1

@janusfidel - 有幾種不同的方法可以改變圖像的顏色內容,從調整曝光度,增益或亮度到移動其中一個顏色分量的值並應用顏色矩陣。在一種情況下使用後者來對圖像執行棕褐色調。除此之外,使用少量類C代碼編寫新的過濾器很容易就可以實現所需的效果。 – 2012-05-17 14:48:52

+0

@布拉德拉森謝謝先生。這幫助了很多。 – janusbalatbat 2012-05-18 07:57:26

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];