GPUImage-使用NSMutableArray串联应用过滤器

布兰登

我正在尝试构建一个动态系统以串联应用多个GPUImage滤镜。

如果我像这样静态定义所有过滤器:

[sourceImage addTarget:filter1];
[filter1 addTarget:filter2];
[filter2 addTarget:filter3];

...等等,这很好。

由于我想拥有可变数量的过滤器,因此变得很麻烦。我想我会尝试使用mutableArray并存储过滤器来执行此操作。不幸的是我遇到了错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to overrelease a framebuffer, did you forget to call -useNextFrameForImageCapture before using -imageFromCurrentFramebuffer?'

研究此错误表明,问题在于过滤器不再是“强”引用,并且一旦对数组进行迭代,它们将被销毁。

如果我对这个假设是正确的,是否有办法重写它,从而不会破坏引用?

这是我的类别实现:

@implementation UIImage (FilterEngine)

- (UIImage*)imageProcessedWithFilterEngine:(FilterProperties*)properties
{

    // Mutable array of filters, for dynamic iteration through only those filters which require applying
    NSMutableArray* filtersList = [NSMutableArray new];

    GPUImagePicture *source = [[GPUImagePicture alloc] initWithImage:self];

    GPUImageCustomFilterEngine* filterEngine;
    if (properties.lookupImageName)
    {
        filterEngine = [[GPUImageCustomFilterEngine alloc] initWithLookupImageName:properties.lookupImageName];
        [filtersList addObject:filterEngine];
    }

    GPUImageBrightnessFilter *brightnessFilter = [GPUImageBrightnessFilter new];
    if (properties.brightness != 0.0)
    {
        brightnessFilter.brightness = properties.brightness;
        [filtersList addObject:brightnessFilter];
    }

    GPUImageContrastFilter *contrastFilter = [GPUImageContrastFilter new];
    if (properties.contrast != 1.0)
    {
        contrastFilter.contrast = properties.contrast;
        [filtersList addObject:contrastFilter];
    }

    GPUImageSaturationFilter *saturationFilter = [GPUImageSaturationFilter new];
    if (properties.saturation != 1.0)
    {
        saturationFilter.saturation = properties.saturation;
        [filtersList addObject:saturationFilter];
    }

    if (filtersList.count > 0)
    {
        [source addTarget:filtersList.firstObject];
        for (int i = 0; i < filtersList.count - 1; i++)
        {
            [(id)[filtersList objectAtIndex:i] addTarget:[filtersList objectAtIndex:i + 1]];
        }

        [source addTarget:filtersList.lastObject];

        [(id)filtersList.lastObject useNextFrameForImageCapture];

        [source processImage];

        return [filtersList.lastObject imageFromCurrentFramebuffer];
    }
    else
        return self;
}

@end
布拉德·拉森(Brad Larson)

扩大我的评论,这里的问题似乎是

[source addTarget:filtersList.lastObject];

对于逻辑的其余部分,您正在通过逐步将过滤器定位到下一个过滤器来正确地附加过滤器。但是,最后一行仅通过将源直接附加到链中的最后一个过滤器而使排序混乱。

如果最后一个过滤器仅接受输入,则该输入将被您的源覆盖。这将导致悬空的滤镜链,该滤镜链由源之后的帧的双向分叉(一个到现在不完整的滤镜链,一个直接到最后一个滤镜)。我可能没有适当地考虑到这一点,因此在该断言中我过度警告了帧缓冲区。

如果我可能要发表最后的评论,则基于UIImage创建GPUImagePicture会有一些开销,因此,如果您找到一种不必每次都需要对图像应用过滤器的方法,那么总的处理将是快多了。同样,如果您可以保留将要重复使用的过滤器,则可以节省一些初始过滤器设置。这可能不适用于您的体系结构,但需要注意。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

GPUImage组过滤器

来自分类Dev

将GPUImage过滤器子类移植到Swift

来自分类Dev

将过滤器应用于 UIScrollView GPUImage 中的当前图像索引

来自分类Dev

如何调整 GPUImage2 以仅使用几个过滤器?

来自分类Dev

如何使用GPUImage压缩视频

来自分类Dev

使用GPUImage框架暂停视频

来自分类Dev

如何使用音频保存GPUImage过滤的视频?

来自分类Dev

GPUImage灰度和污点过滤器生成内存警告

来自分类Dev

GPUImage需要时间来应用滤镜

来自分类Dev

使用Android的GPUImage进行视频处理

来自分类Dev

使用GPUImage库进行高斯模糊

来自分类Dev

iOS-减少GPUImage RAM的使用

来自分类Dev

如何使用 GPUImage 框架卡通化图像?

来自分类Dev

有人可以用简单的词来解释GPUImage中的过滤器链吗?

来自分类Dev

GPUImage和GPUImageView:应用由于内存错误而终止

来自分类Dev

使用GPUImage Framework在滤镜链之间切换

来自分类Dev

使用GPUImage将黑色以下的颜色转换为白色

来自分类Dev

如何在Android中无比例使用GPUImage

来自分类Dev

使用GPUImage将图像添加到视频

来自分类Dev

使用GPUImage将两个视频与色度键融合

来自分类Dev

ios GPUImage,使用小尺寸图像处理图像的结果不好?

来自分类Dev

使用GPUImage和GPUImageHoughTransformLineDetector检测突出显示的文本边界框

来自分类Dev

使用GPUImage重新创建iOS 7 Glass效果

来自分类Dev

在iPhone编程中使用GPUImage框架处理视频

来自分类Dev

使用GPUImage将图像添加到视频

来自分类Dev

使用GPUImage将黑色以下的颜色转换为白色

来自分类Dev

使用GPUImage与Core Image与UIImage进行解压缩?

来自分类Dev

GPUImage无法使用数据初始化ACVFile :(空)

来自分类Dev

如何使用GPUImage启用64位支持

Related 相关文章

热门标签

归档