我正在尝试构建一个动态系统以串联应用多个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
扩大我的评论,这里的问题似乎是
[source addTarget:filtersList.lastObject];
对于逻辑的其余部分,您正在通过逐步将过滤器定位到下一个过滤器来正确地附加过滤器。但是,最后一行仅通过将源直接附加到链中的最后一个过滤器而使排序混乱。
如果最后一个过滤器仅接受输入,则该输入将被您的源覆盖。这将导致悬空的滤镜链,该滤镜链由源之后的帧的双向分叉(一个到现在不完整的滤镜链,一个直接到最后一个滤镜)。我可能没有适当地考虑到这一点,因此在该断言中我过度警告了帧缓冲区。
如果我可能要发表最后的评论,则基于UIImage创建GPUImagePicture会有一些开销,因此,如果您找到一种不必每次都需要对图像应用过滤器的方法,那么总的处理将是快多了。同样,如果您可以保留将要重复使用的过滤器,则可以节省一些初始过滤器设置。这可能不适用于您的体系结构,但需要注意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句