2012-04-21 33 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];