Рисование GPUImage поверх другого с помощью умножения и альфа-канала

Я пытаюсь наложить одно изображение поверх другого изображения с помощью альфы и многократно смешать с помощью GPUImage. В 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, я могу заставить работать либо умножение, либо альфу, но я не могу заставить их работать оба. Я чувствую, что есть что-то с объединением фильтров GPUImage, чего я не понимаю. Вот одна из многих разных попыток того, что я делал с GPUImage, чтобы заставить это работать. Эта версия кода выполняет умножение, но не альфа-канал.

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

И вот что я получаю, когда использую GPUImage

GPUImage обработано


person Stephen Johnson    schedule 24.02.2014    source источник


Ответы (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];

Он работает как конвейер, где результаты одного фильтра являются входом для следующего.

person Barbara R    schedule 24.02.2014
comment
Спасибо за ответ! Я обновляю свой исходный пост выводом изображения, которого я пытаюсь достичь, и выводом, который я получаю, когда использую GPUImage, используя ваш код выше. Цвета выглядят неправильно. - person Stephen Johnson; 25.02.2014