GPUImage:imageByFilteringImage 导致内存压力导致应用程序崩溃
GPUImage: imageByFilteringImage causes memory pressure resulting app crash
我正在使用 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;
}
我找到了问题的解决方案。实际上,我正在对不需要的 full/big 缩略图应用过滤器。大小为 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;
}
我正在使用 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;
}
我找到了问题的解决方案。实际上,我正在对不需要的 full/big 缩略图应用过滤器。大小为 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;
}