使用乘法和alpha绘制另一个GPUImage

时间:2014-02-24 14:04:43

标签: ios gpuimage

我正在尝试使用GPUImage将alpha图像与多个混合叠加在另一个图像的顶部。在Core Graphics中,我正在做的事情。

CGContextRef ctx = UIGraphicsGetCurrentContext();
UIImage* baseImage = ...;
UIImage* overImage = ...;
CGSize size = baseImage.size;

// Draw the base image
CGContextDrawImage(ctx, CGRectMake(0, 0, size.width, size.height), baseImage.CGImage);

//Draw the overlay
CGContextSetAlpha(ctx, .5);
CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
CGContextDrawImage(ctx, CGRectMake(0, 0, size.width, size.height), overImage.CGImage);

当我尝试使用GPUImage做同样的事情时,我可以得到乘法或alpha工作,但我不能让它们都工作。我觉得有一些东西与我不理解的GPUImage过滤器相结合。以下是我使用GPUImage进行此操作的许多不同尝试之一。这个版本的代码正在进行乘法而不是alpha。

GPUImagePicture *pictureOverlay = [[GPUImagePicture alloc] initWithImage:overImage];
GPUImageOpacityFilter* opacityFilter = [[GPUImageOpacityFilter alloc] init];
opacityFilter.opacity = .5;

[pictureOverlay addTarget:opacityFilter];
[pictureOverlay processImage];


pictureOverlay = [[GPUImagePicture alloc] initWithImage:[opacityFilter imageFromCurrentlyProcessedOutput]];

GPUImagePicture *pictureBase = [[GPUImagePicture alloc] initWithImage:baseImage];
GPUImageMultiplyBlendFilter *filter = [[GPUImageMultiplyBlendFilter alloc] init];

[pictureBase addTarget:filter];
[pictureOverlay addTarget:filter];

UIImage* finalImage = [filter imageFromCurrentlyProcessedOutput];

非常感谢任何帮助。

以下是我使用Core Graphics进行处理时的图像。

CoreGraphics Drawn image

以下是我使用GPUImage时的结果

GPUImage processed

1 个答案:

答案 0 :(得分:1)

尝试以下操作,我目前正在使用GPUImage,我认为以下内容对您有用:

GPUImagePicture *pictureBase = [[GPUImagePicture alloc] initWithImage:baseImage];
GPUImageMultiplyBlendFilter *filter = [[GPUImageMultiplyBlendFilter alloc] init];

[pictureBase addTarget:filter];
[pictureBase processImage];

GPUImagePicture *pictureOverlay = [[GPUImagePicture alloc] initWithImage:overImage];
GPUImageOpacityFilter* opacityFilter = [[GPUImageOpacityFilter alloc] init];
opacityFilter.opacity = .5;

[pictureOverlay addTarget:opacityFilter];
[opacityFilter addTarget:filter];
[pictureOverlay processImage];

 UIImage* finalImage = [filter imageFromCurrentlyProcessedOutput];

它就像一个管道,其中一个过滤器的结果是下一个过滤器的输入。