Смеси с GPUImageView не дают ожидаемого результата
Когда я использую смеси с GPUImageView, они, кажется, не работают. Например, test1, который захватывает результат в изображение и помещает его в imageView, работает... где test2, который устанавливает GPUImageView в качестве цели..., похоже, не работает. test1 дает мне ожидаемое изображение... с моими тестовыми изображениями test2 дает мне черный экран.
+ (void)test1:(UIImage*)image imageView:(UIImageView*)imageView {
GPUImagePicture *pictureBase = [[GPUImagePicture alloc] initWithImage:image];
GPUImagePicture *pictureOverlay = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"overlay.png"]];
GPUImageMultiplyBlendFilter *filter = [[GPUImageMultiplyBlendFilter alloc] init];
[pictureBase addTarget:filter];
[pictureOverlay addTarget:filter];
[pictureBase processImage];
[pictureOverlay processImage];
imageView.image = [filter imageFromCurrentlyProcessedOutputWithOrientation:UIImageOrientationUp];
}
+ (void)test2:(UIImage*)image gpuImageView:(GPUImageView*)gpuImageView {
GPUImagePicture *pictureBase = [[GPUImagePicture alloc] initWithImage:image];
GPUImagePicture *pictureOverlay = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"overlay.png"]];
GPUImageMultiplyBlendFilter *filter = [[GPUImageMultiplyBlendFilter alloc] init];
[pictureBase addTarget:filter];
[pictureOverlay addTarget:filter];
[filter addTarget:gpuImageView];
[pictureBase processImage];
[pictureOverlay processImage];
}
1 ответ
Я считаю, что здесь происходит то, что ваш экземпляр GPUImagePicture освобождается в конце этого метода (если это проект с поддержкой ARC). Когда это происходит, он вытаскивает коврик из-под остальной части вашей цепочки фильтров и приводит к черному изображению в вашем поле зрения (вы можете ненадолго увидеть правильное изображение, а затем вспыхнуть черным).
Этого не происходит в случае, когда вы извлекаете UIImage, потому что извлечение UIImage блокирует до тех пор, пока не будет выполнена обработка, после чего не имеет значения, что происходит с вашей цепочкой фильтров.
Чтобы предотвратить это, сделайте GPUImagePicture переменной экземпляра в вашем охватывающем классе, чтобы он зависал дольше, чем конец вашего метода.