3

如何使用 Image Magick 库或 iphone 的 obj-c 代码复制 Photoshop“乘法效果”?我在哪里可以找到一些示例代码?我也看到了这个问题

4

3 回答 3

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 的图像。我正在努力解决这个问题。

于 2012-04-21T21:49:52.367 回答
4

Multiply 是一种(Adobe 称之为)混合模式。混合模式本质上是使用一些数学公式的像素操作。您可以将两个图像混合在一起,或者您可以使用一个,从而产生“自混合”。

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

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

unsigned char result = a * b / 255;

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

于 2012-04-21T16:46:31.843 回答
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];
于 2014-06-06T13:10:46.637 回答