我目前正在使用GPUImage提供的三个滤镜(Amatorka,Etikate小姐和Soft Elegance),并且理想情况下,希望用户能够在拍摄照片后立即将滤镜应用于其照片(例如,用户可以向左滑动或紧接着在照片上,以查看应用了滤镜的照片的外观)

我当前的问题是,从头到尾,这三个过滤器需要大约1.5秒以上才能完成处理(在iPhone 5上)。我试图通过将过滤器存储为strong属性并在viewDidLoad中实例化它们来加快过程,但是所有这些结果都是内存警告,并且应用程序崩溃。我想知道是否有一个很好的解决方法,可以用拍摄的图像“预填充”滤镜,以便无需等待即可快速应用滤镜,或者这是否意味着要使用它。

非常感谢您的帮助。我在下面粘贴了一个示例方法,该方法使用了Amatorka过滤器:

- (void)processAmatorkaFilter
{
    dispatch_queue_t backgroundQueue = dispatch_queue_create("queue1", 0);

    dispatch_async(backgroundQueue, ^{
        //do filter work
        UIImage *imageShown = self.totalOriginalImage;
        GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:imageShown];
        GPUImageAmatorkaFilter *amoFilter = [[GPUImageAmatorkaFilter alloc] init];

        [stillImageSource addTarget:amoFilter];
        [amoFilter useNextFrameForImageCapture];
        [stillImageSource processImage];

        UIImage *currentFilteredVideoFrame = [amoFilter imageFromCurrentFramebuffer];
        UIImage *revampedImage = [self orientationAdjustment:currentFilteredVideoFrame];

        if (isFrontFacing){
            revampedImage = [UIImage imageWithCGImage:revampedImage.CGImage scale:revampedImage.scale orientation:UIImageOrientationLeftMirrored];
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.filteredImageArray addObject:revampedImage];
            NSLog(@"\n\nDone Amatorka\n\n");
        });
    });
}

这就是我允许应用过滤器的方式:
- (void)handleLeftSwipe:(UIGestureRecognizer*)recognizer {
    NSLog(@"Swiped left");

    if (rotatingNumber == 3){ //3 filters and 1 original image in total
        rotatingNumber = 0;
    } else {
        rotatingNumber++;
    }

    UIImage *swipedImage = [self.filteredImageArray objectAtIndex:rotatingNumber];
    self.imageView.image = swipedImage;

}

最佳答案

Amatorka,Etikate小姐和Soft Elegance滤镜都是GPUImageLookupFilter的子类。子类化的查找过滤器与其他过滤器有点不同,因为它们使用GPUImagePicture的内部实例来提取用于这些过滤器的查找表。在这样的查找的第一个实例中,初始化和上传这些查找图像可能会花费一些时间。

您可以不必依赖过滤器就可以加快此过程的一种方法(尽管您应该能够使用我最新的缓存帧缓冲区优化来实现所描述的内存效果而不会造成描述的内存问题)是手动复制这些查找。

如果查看那些查找过滤器子类,您将看到它们用于查找的图像(“lookup_miss_etikate.png”等)。从这些图像中的每一个手动创建一个GPUImagePicture实例,并坚持下去。当您需要创建特定类型的查找过滤器时,只需将查找图像添加到查找过滤器的第二个输入位置:

[lookupImage addTarget:lookupFilter atTextureLocation:1];

您将重新创建该特定的查找过滤器子类。它的行为就像子类一样,只是您避免每次都必须创建和上传查找图像。

完成后,删除查找过滤器作为查找图像的目标,并根据需要处理该过滤器。

关于ios - 如何“预填充” GPUImage滤镜以加快加载时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23557107/

10-10 20:50