【问题标题】:GPUImage: imageByFilteringImage causes memory pressure resulting app crashGPUImage: imageByFilteringImage 导致内存压力导致应用程序崩溃
【发布时间】:2015-08-15 09:01:48
【问题描述】:

我正在使用 GPUImage 来应用视频滤镜。但在将过滤器应用于特定视频之前,我在 UIScrollView 底部的视频缩略图上显示过滤器预览。为此,我使用 imageByFilteringImage: 过滤方法,我认为它会导致内存压力和应用程序崩溃。请检查下面的代码并提出必要的更改:

// Get the thumnail image form video
    AVURLAsset* asset = [AVURLAsset URLAssetWithURL:self.movieURL options:nil];
    AVAssetImageGenerator* imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset];
    imageGenerator.appliesPreferredTrackTransform = true;
    UIImage *thumbailImage = [UIImage imageWithCGImage:[imageGenerator copyCGImageAtTime:CMTimeMake(0, 1) actualTime:nil error:nil]];

    CGFloat xLocation = 10;
    for (NSNumber *filterNumber in videoFilterList) {
        NSLog(@"filterNumber : %@",filterNumber);

        UILabel *filterNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(xLocation, 12, 50, 16)];
        filterNameLabel.backgroundColor = [UIColor clearColor];
        filterNameLabel.textAlignment = NSTextAlignmentCenter;
        filterNameLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:10];

        UIImage *quickFilteredImage = thumbailImage;
        switch (tag) {
            case GPUIMAGE_SATURATION:
            {
                filter = nil;
                filter = [[GPUImageSaturationFilter alloc] init];
                [(GPUImageSaturationFilter *)filter setSaturation:0.0];
                quickFilteredImage = [filter imageByFilteringImage:thumbailImage];
                filterNameLabel.text = @"B&W";
            } break;
            case GPUIMAGE_SEPIA:
            {
                filter = nil;
                filter = [[GPUImageSepiaFilter alloc] init];
                quickFilteredImage = [filter imageByFilteringImage:thumbailImage];
                filterNameLabel.text = @"Sepia";
            } break;
            case GPUIMAGE_GRAYSCALE:
            {
                filter = nil;
                filter = [[GPUImageGrayscaleFilter alloc] init];
                quickFilteredImage = [filter imageByFilteringImage:thumbailImage];
                filterNameLabel.text = @"GrayScale"; break;
            }
        }
        [self.previewFiltersScrollView addSubview:filterNameLabel];

        UIImageView *previewFilterImageView = [[UIImageView alloc] initWithFrame:CGRectMake(xLocation, -40, 50, 50)];
        previewFilterImageView.userInteractionEnabled = YES;
        previewFilterImageView.tag = tag;
        previewFilterImageView.contentMode = UIViewContentModeScaleAspectFit;
        previewFilterImageView.image = quickFilteredImage;

        UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(applyFilter:)];
        tapGestureRecognizer.numberOfTapsRequired = 1;
        tapGestureRecognizer.numberOfTouchesRequired = 1;
        [previewFilterImageView addGestureRecognizer:tapGestureRecognizer];

        [self.previewFiltersScrollView addSubview:previewFilterImageView];

        tag++;
        xLocation += 60;
    } 

【问题讨论】:

    标签: ios gpuimage


    【解决方案1】:

    我找到了我的问题的解决方案。实际上,我正在对不需要的完整/大缩略图应用过滤器。尺寸为 50x50 的预览过滤器图像视图。所以我首先减小了缩略图的大小(保持纵横比),然后对其应用过滤器。现在它工作正常。请在下面的代码中查看我的编辑:

    // Get the thumnail image form video
        AVURLAsset* asset = [AVURLAsset URLAssetWithURL:self.movieURL options:nil];
        AVAssetImageGenerator* imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset];
        imageGenerator.appliesPreferredTrackTransform = true;
        UIImage *thumbailImage = [UIImage imageWithCGImage:[imageGenerator copyCGImageAtTime:CMTimeMake(0, 1) actualTime:nil error:nil]];
    
    // Compress the image with aspect fit
        CGSize aspectSize = CGSizeMake(100, 100);
        CGSize imageViewSize = CGSizeMake(100, 100);
        CGFloat aspect = tmpThumbnailImage.size.width / tmpThumbnailImage.size.height;
        if (imageViewSize.width / aspect <= imageViewSize.height) {
            aspectSize = CGSizeMake(imageViewSize.width, imageViewSize.width / aspect);
        } else {
            aspectSize = CGSizeMake(imageViewSize.height * aspect, imageViewSize.height);
        }
        UIGraphicsBeginImageContext(aspectSize);
        [tmpThumbnailImage drawInRect:CGRectMake(0, 0, aspectSize.width, aspectSize.height)];
        thumbailImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        CGFloat xLocation = 10;
        for (NSNumber *filterNumber in videoFilterList) {
            NSLog(@"filterNumber : %@",filterNumber);
    
         NSInteger tag = [filterNumber intValue];
    
            UILabel *filterNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(xLocation, 12, 50, 16)];
            filterNameLabel.backgroundColor = [UIColor clearColor];
            filterNameLabel.textAlignment = NSTextAlignmentCenter;
            filterNameLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:10];
    
            UIImage *quickFilteredImage = thumbailImage;
            switch (tag) {
                case GPUIMAGE_SATURATION:
                {
                    filter = nil;
                    filter = [[GPUImageSaturationFilter alloc] init];
                    [(GPUImageSaturationFilter *)filter setSaturation:0.0];
                    quickFilteredImage = [filter imageByFilteringImage:thumbailImage];
                    filterNameLabel.text = @"B&W";
                } break;
                case GPUIMAGE_SEPIA:
                {
                    filter = nil;
                    filter = [[GPUImageSepiaFilter alloc] init];
                    quickFilteredImage = [filter imageByFilteringImage:thumbailImage];
                    filterNameLabel.text = @"Sepia";
                } break;
                case GPUIMAGE_GRAYSCALE:
                {
                    filter = nil;
                    filter = [[GPUImageGrayscaleFilter alloc] init];
                    quickFilteredImage = [filter imageByFilteringImage:thumbailImage];
                    filterNameLabel.text = @"GrayScale"; break;
                }
            }
            [self.previewFiltersScrollView addSubview:filterNameLabel];
    
            UIImageView *previewFilterImageView = [[UIImageView alloc] initWithFrame:CGRectMake(xLocation, -40, 50, 50)];
            previewFilterImageView.userInteractionEnabled = YES;
            previewFilterImageView.tag = tag;
            previewFilterImageView.contentMode = UIViewContentModeScaleAspectFit;
            previewFilterImageView.image = quickFilteredImage;
    
            UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(applyFilter:)];
            tapGestureRecognizer.numberOfTapsRequired = 1;
            tapGestureRecognizer.numberOfTouchesRequired = 1;
            [previewFilterImageView addGestureRecognizer:tapGestureRecognizer];
    
            [self.previewFiltersScrollView addSubview:previewFilterImageView];
    
            xLocation += 60;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-11
      • 2011-07-08
      • 2013-10-15
      • 2011-04-29
      • 1970-01-01
      • 2015-10-21
      • 2016-06-04
      • 2011-08-24
      相关资源
      最近更新 更多