Смеси с 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 переменной экземпляра в вашем охватывающем классе, чтобы он зависал дольше, чем конец вашего метода.

Другие вопросы по тегам