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

标签 ios objective-c uiscrollview uiimage gpuimage

我目前正在通过 UIScrollView 部署一个 ImageScroller,它在底部包含一个过滤器工具栏,如您在图像上所见。

enter image description here

但我面临的问题是,当我按下按钮时,滤镜仅适用于最后一张图像,如下例所示:

Gif 示例

Gif Example

所以请任何人都可以帮助我解决这个问题,我的预期输出是过滤器应用于当前显示的图像,而不仅仅是最后一张。在此我附上我的代码供您引用,非常感谢您。

@interface EditImageVC ()
@end

@implementation EditImageVC


UIImageView *img;


- (void)viewDidLoad {
    [super viewDidLoad];
    int x=0;
    for (int i = 0; i < _scrollViewImageArray.count ; i++) {

        _picture = [_scrollViewImageArray objectAtIndex:i];
        img =[[UIImageView alloc]initWithFrame:CGRectMake(x,20,[[UIScreen mainScreen] bounds].size.width, 
        self.imgScrollView.frame.size.height)];
        img.image =_picture;
        x=x+[[UIScreen mainScreen] bounds].size.width;
        [_imgScrollView addSubview:img];
    }
    _imgScrollView.backgroundColor = [UIColor blackColor];
    _imgScrollView.contentSize=CGSizeMake(x, 
    _imgScrollView.frame.size.height);
    _imgScrollView.contentOffset=CGPointMake(0, 0);
    img.contentMode = UIViewContentModeScaleAspectFit;
}


-(void)viewDidLayoutSubviews{
     self.automaticallyAdjustsScrollViewInsets = NO;
}



 - (IBAction)filterAction:(UIButton *)sender {

    for (int i = 0; i < _scrollViewImageArray.count ; i++) {
        UIImage *picture = [_scrollViewImageArray objectAtIndex:i];
        GPUImageFilter *selectedFilter;
        switch (sender.tag) {
            case 0:
                selectedFilter = [[GPUImageSepiaFilter alloc] init];
                break;
            case 1:
                selectedFilter = [[GPUImageToonFilter alloc] init];
                break;
            default:
                break;
        }
        UIImage *filteredImage = [selectedFilter imageByFilteringImage:picture];
        [img setImage:filteredImage];
    }
}

最佳答案

只过滤最后显示的图像,当 ScrollView 滚动到另一个图像时过滤图像。

记得添加UIScrollViewDelegate

@interface EditImageVC : UIViewController <UIScrollViewDelegate>   {
}

@end

- (void)viewDidLoad {
    [super viewDidLoad];
    imageViewsArray = [[NSMutableArray alloc] init];
    int x=0;
    for (int i = 0; i < _scrollViewImageArray.count ; i++) {

        _picture = [_scrollViewImageArray objectAtIndex:i];
        img =[[UIImageView alloc]initWithFrame:CGRectMake(x,20,[[UIScreen mainScreen] bounds].size.width,

        self.imgScrollView.frame.size.height)];
        img.image =_picture;
        [imageViewsArray addObject:img];
        x=x+[[UIScreen mainScreen] bounds].size.width;
        [self.imgScrollView addSubview:img];
    }
    self.imgScrollView.backgroundColor = [UIColor blackColor];
    self.imgScrollView.contentSize=CGSizeMake(x,
                                          self.imgScrollView.frame.size.height);
    self.imgScrollView.contentOffset=CGPointMake(0, 0);
    img.contentMode = UIViewContentModeScaleAspectFit;

    self.imgScrollView.delegate = self;
}

GPUImageFilter *selectedFilter = nil;

NSInteger currentShownIndex = 0;
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSInteger indexAfterScrolled = scrollView.contentOffset.x / scrollView.frame.size.width;
    if(indexAfterScrolled==currentShownIndex) return;
    currentShownIndex = indexAfterScrolled;
    if(selectedFilter!=nil) {
        UIImage *filteredImage = [selectedFilter imageByFilteringImage:[_scrollViewImageArray objectAtIndex:currentShownIndex]];
        [[imageViewsArray objectAtIndex:currentShownIndex] setImage:filteredImage];
    }
}

- (IBAction)filterAction:(UIButton *)sender {

    switch (sender.tag) {
        case 0:
            selectedFilter = [[GPUImageSepiaFilter alloc] init];
            break;
        case 1:
            selectedFilter = [[GPUImageToonFilter alloc] init];
            break;
        default:
            break;
    }
    UIImage *picture = [_scrollViewImageArray objectAtIndex:currentShownIndex];
    UIImage *filteredImage = [selectedFilter imageByFilteringImage:picture];
    [[imageViewsArray objectAtIndex:currentShownIndex] setImage:filteredImage];
}

已更新 如果你想过滤当前显示的图像,不需要应用 UIScrollViewDelegate:

    - (void)viewDidLoad {
        [super viewDidLoad];
        imageViewsArray = [[NSMutableArray alloc] init];
        int x=0;
        for (int i = 0; i < _scrollViewImageArray.count ; i++) {

            _picture = [_scrollViewImageArray objectAtIndex:i];
            img =[[UIImageView alloc]initWithFrame:CGRectMake(x,20,[[UIScreen mainScreen] bounds].size.width,

            self.imgScrollView.frame.size.height)];
            img.image =_picture;
            [imageViewsArray addObject:img];
            x=x+[[UIScreen mainScreen] bounds].size.width;
            [self.imgScrollView addSubview:img];
        }
        self.imgScrollView.backgroundColor = [UIColor blackColor];
        self.imgScrollView.contentSize=CGSizeMake(x,
                                              self.imgScrollView.frame.size.height);
        self.imgScrollView.contentOffset=CGPointMake(0, 0);
        img.contentMode = UIViewContentModeScaleAspectFit;

        self.imgScrollView.delegate = self;
    }

    - (IBAction)filterAction:(UIButton *)sender {
        NSInteger objectAtIndex:currentShownIndex = scrollView.contentOffset.x / scrollView.frame.size.width;
            GPUImageFilter *selectedFilter = nil;

        switch (sender.tag) {
            case 0:
                selectedFilter = [[GPUImageSepiaFilter alloc] init];
                break;
            case 1:
                selectedFilter = [[GPUImageToonFilter alloc] init];
                break;
            default:
                break;
        }
        UIImage *picture = [_scrollViewImageArray objectAtIndex:currentShownIndex];
        UIImage *filteredImage = [selectedFilter imageByFilteringImage:picture];
        [[imageViewsArray objectAtIndex:currentShownIndex] setImage:filteredImage];
    }

关于ios - 将过滤器应用于 UIScrollView GPUImage 中的当前图像索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45048356/

相关文章:

ios - UIScrollView 现在不会删除键盘 iOS?

ios - 当弹跳设置为 NO 时,嵌套的 UIScrollView 不会弹跳并且不会检测慢速滑动手势

ios - 更改高度时如何在单元格中显示标签 View 的全文

ios - 查询从 Parse DB 中检索当前登录用户的 BOOL,这将确定要转到的 segue

ios - 应用程序从后台状态转到前台时的 OpenTok 视频通话问题

objective-c - 放大 ScrollView ios6

ios - Firebase 查询无法正常工作

ios - 如何在 UIView 表格单元格中制作幻灯片

iphone - 将 UIButton 添加到 UItableview 单元格

ios - 如何绘制围绕右上角和右下角的对象流动的文本?