复制Photoshop“乘法效果”

时间:2012-04-21 16:19:36

标签: iphone c++ objective-c imagemagick photoshop

我如何使用Image Magick库或iphone的obj-c代码复制Photoshop“Multiply effects”? 我在哪里可以找到一些示例代码? 我也看到了question

3 个答案:

答案 0 :(得分: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的图像。我正在努力解决这个问题。

答案 1 :(得分:4)

Multiply是一种(Adobe调用的)混合模式。混合模式基本上是使用一些数学公式的像素操作。您可以将两个图像混合在一起,也可以使用一个图像,从而实现“自我混合”。

这可以通过逐个像素地对图像进行操作来实现,方法是获取特定像素的每个通道值并对其进行处理。

不幸的是,我不熟悉Magick图书馆。但是,这里有一个公式,给定一个通道值(红色,绿色或蓝色,0 - 255)将返回乘法运算的结果值。

unsigned char result = a * b / 255;

这里注意,a和b也必须是无符号字符,否则可能会发生溢出,因为结果会大于一个字节。这是基本的乘法公式,您可以通过分配更大的变量大小并适当地修改除数来调整变量以支持每通道16位。

答案 2 :(得分: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];