zoukankan      html  css  js  c++  java
  • 美图秀秀美化图片之【增强】模块界面与功能设计

      本文从【增强】模块入手介绍一下界面设计和功能实现。所有功能都已实现,部分功能有待改善,我会在以后时间中步步改善。目前效果也很棒。有兴趣的可以在文章最后提供的下载链接中下载并运行。模拟器最好使用iphone6模拟器【增强】功能包含如下功能

      1.亮度

      2.对比度

      3.色温

      4.饱和度

      5.高光

      6.暗部

      7.智能补光

    涉及开发技巧

      效果bar的实现

      UISlider的使用

      GPUImage的使用

      一、自定义bar

      点击一个效果按钮时,该按钮变为高亮状态,而前面的按钮自动恢复到正常状态

      代码实现

    #import <UIKit/UIKit.h>
    
    
    @class FWEffectBar, FWEffectBarItem;
    
    @protocol FWEffectBarDelegate <NSObject>
    - (void)effectBar:(FWEffectBar *)bar didSelectItemAtIndex:(NSInteger)index;
    
    @end
    
    @interface FWEffectBar : UIScrollView
    
    @property (nonatomic, assign) id<FWEffectBarDelegate> delegate;
    @property (nonatomic, copy) NSArray *items;
    @property (nonatomic, weak) FWEffectBarItem *selectedItem;
    @property UIEdgeInsets contentEdgeInsets;
    
    /**
     * Sets the height of tab bar.
     */
    - (void)setHeight:(CGFloat)height;
    
    /**
     * Returns the minimum height of tab bar's items.
     */
    - (CGFloat)minimumContentHeight;
    
    @end
    FWEffectBar.h
    //
    //  FWEffectBar.m
    //  FWMeituApp
    //
    //  Created by ForrestWoo on 15-9-23.
    //  Copyright (c) 2015年 ForrestWoo co,.ltd. All rights reserved.
    //
    
    #import "FWEffectBar.h"
    #import "FWEffectBarItem.h"
    
    @interface FWEffectBar ()
    
    @property (nonatomic) CGFloat itemWidth;
    
    @end
    
    @implementation FWEffectBar
    
    - (id)initWithFrame:(CGRect)frame {
        self = [super initWithFrame:frame];
        if (self) {
        }
        return self;
    }
    
    - (id)initWithCoder:(NSCoder *)aDecoder {
        self = [super initWithCoder:aDecoder];
        if (self) {
        }
        return self;
    }
    
    - (id)init {
        return [self initWithFrame:CGRectZero];
    }
    
    - (void)layoutSubviews {
        CGSize frameSize = self.frame.size;
        CGFloat minimumContentHeight = [self minimumContentHeight];
        
        [self setItemWidth:roundf((frameSize.width - [self contentEdgeInsets].left -
                                   [self contentEdgeInsets].right) / [[self items] count])];
        
        NSInteger index = 0;
        
        // Layout items
        
        for (FWEffectBarItem *item in [self items]) {
            CGFloat itemHeight = [item itemHeight];
            
            if (!itemHeight) {
                itemHeight = frameSize.height;
            }
            
            [item setFrame:CGRectMake(self.contentEdgeInsets.left + (index * self.itemWidth),
                                      roundf(frameSize.height - itemHeight) - self.contentEdgeInsets.top,
                                      self.itemWidth, itemHeight - self.contentEdgeInsets.bottom)];
            [item setNeedsDisplay];
            
            index++;
        }
    }
    
    #pragma mark - Configuration
    
    - (void)setItemWidth:(CGFloat)itemWidth {
        if (itemWidth > 0) {
            _itemWidth = itemWidth;
        }
    }
    
    - (void)setItems:(NSArray *)items {
        for (FWEffectBarItem *item in _items) {
            [item removeFromSuperview];
        }
        
        _items = [items copy];
        for (FWEffectBarItem *item in _items) {
            [item addTarget:self action:@selector(tabBarItemWasSelected:) forControlEvents:UIControlEventTouchDown];
            [self addSubview:item];
        }
    }
    
    - (void)setHeight:(CGFloat)height {
        [self setFrame:CGRectMake(CGRectGetMinX(self.frame), CGRectGetMinY(self.frame),
                                  CGRectGetWidth(self.frame), height)];
    }
    
    - (CGFloat)minimumContentHeight {
        CGFloat minimumTabBarContentHeight = CGRectGetHeight([self frame]);
        
        for (FWEffectBarItem *item in [self items]) {
            CGFloat itemHeight = [item itemHeight];
            if (itemHeight && (itemHeight < minimumTabBarContentHeight)) {
                minimumTabBarContentHeight = itemHeight;
            }
        }
        
        return minimumTabBarContentHeight;
    }
    
    #pragma mark - Item selection
    
    - (void)tabBarItemWasSelected:(id)sender {
        [self setSelectedItem:sender];
        
        if ([[self delegate] respondsToSelector:@selector(effectBar:didSelectItemAtIndex:)]) {
            NSInteger index = [self.items indexOfObject:self.selectedItem];
            [[self delegate] effectBar:self didSelectItemAtIndex:index];
        }
    }
    
    - (void)setSelectedItem:(FWEffectBarItem *)selectedItem {
        if (selectedItem == _selectedItem) {
            return;
        }
        [_selectedItem setSelected:NO];
        
        _selectedItem = selectedItem;
        [_selectedItem setSelected:YES];
    }
    
    @end
    FWEffectBar.m

      我定义了一个FWEffectBarDelegate的协议,当点击bar中按钮时,将触发- (void)effectBar:(FWEffectBar *)bar didSelectItemAtIndex:(NSInteger)index,我们可以在FWEffectBar的代理中实现当我们点击按钮时要做的事情。

    items属性是该bar所包含的所有子项(FWEffectBarItem)。

     FWEffectBarItem是包含在bar中的按钮,图像文字竖着排列,当点击它时将呈现高亮状态。

    //
    //  FWEffectBarItem.h
    //  FWMeituApp
    //
    //  Created by ForrestWoo on 15-9-23.
    //  Copyright (c) 2015年 ForrestWoo co,.ltd. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    @interface FWEffectBarItem : UIControl
    
    /**
     * itemHeight is an optional property. When set it is used instead of tabBar's height.
     */
    @property CGFloat itemHeight;
    
    #pragma mark - Title configuration
    
    /**
     * The title displayed by the tab bar item.
     */
    @property (nonatomic, copy) NSString *title;
    
    /**
     * The offset for the rectangle around the tab bar item's title.
     */
    @property (nonatomic) UIOffset titlePositionAdjustment;
    
    /**
     * For title's text attributes see
     * https://developer.apple.com/library/ios/documentation/uikit/reference/NSString_UIKit_Additions/Reference/Reference.html
     */
    
    /**
     * The title attributes dictionary used for tab bar item's unselected state.
     */
    @property (copy) NSDictionary *unselectedTitleAttributes;
    
    /**
     * The title attributes dictionary used for tab bar item's selected state.
     */
    @property (copy) NSDictionary *selectedTitleAttributes;
    
    #pragma mark - Image configuration
    
    /**
     * The offset for the rectangle around the tab bar item's image.
     */
    @property (nonatomic) UIOffset imagePositionAdjustment;
    
    /**
     * The image used for tab bar item's selected state.
     */
    - (UIImage *)finishedSelectedImage;
    
    /**
     * The image used for tab bar item's unselected state.
     */
    - (UIImage *)finishedUnselectedImage;
    
    /**
     * Sets the tab bar item's selected and unselected images.
     */
    - (void)setFinishedSelectedImage:(UIImage *)selectedImage withFinishedUnselectedImage:(UIImage *)unselectedImage;
    
    #pragma mark - Background configuration
    
    /**
     * The background image used for tab bar item's selected state.
     */
    - (UIImage *)backgroundSelectedImage;
    
    /**
     * The background image used for tab bar item's unselected state.
     */
    - (UIImage *)backgroundUnselectedImage;
    
    /**
     * Sets the tab bar item's selected and unselected background images.
     */
    - (void)setBackgroundSelectedImage:(UIImage *)selectedImage withUnselectedImage:(UIImage *)unselectedImage;
    
    @end
    FWEffectBarItem.h
    //
    //  FWEffectBarItem.m
    //  FWMeituApp
    //
    //  Created by ForrestWoo on 15-9-23.
    //  Copyright (c) 2015年 ForrestWoo co,.ltd. All rights reserved.
    //
    
    #import "FWEffectBarItem.h"
    
    @interface FWEffectBarItem ()
    {
        NSString *_title;
        UIOffset _imagePositionAdjustment;
        NSDictionary *_unselectedTitleAttributes;
        NSDictionary *_selectedTitleAttributes;
    }
    
    @property UIImage *unselectedBackgroundImage;
    @property UIImage *selectedBackgroundImage;
    @property UIImage *unselectedImage;
    @property UIImage *selectedImage;
    
    @end
    
    @implementation FWEffectBarItem
    
    - (id)initWithFrame:(CGRect)frame
    {
        if (self = [super initWithFrame:frame]) {
            [self commonInitialization];
        }
        return self;
    }
    
    - (id)initWithCoder:(NSCoder *)aDecoder
    {
        if (self = [super initWithCoder:aDecoder]) {
            [self commonInitialization];
        }
        return self;
    }
    
    - (id)init
    {
        return [self initWithFrame:CGRectZero];
    }
    
    - (void)commonInitialization {
        // Setup defaults
        
        [self setBackgroundColor:[UIColor clearColor]];
        
        _title = @"";
        _titlePositionAdjustment = UIOffsetZero;
        
        if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
            _unselectedTitleAttributes = @{
                                           NSFontAttributeName: [UIFont systemFontOfSize:12],
                                           NSForegroundColorAttributeName: [UIColor whiteColor],
                                           };
        } else {
    #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0
            _unselectedTitleAttributes = @{
                                           UITextAttributeFont: [UIFont systemFontOfSize:12],
                                           UITextAttributeTextColor: [UIColor blackColor],
                                           };
    #endif
        }
        
        _selectedTitleAttributes = [_unselectedTitleAttributes copy];
    }
    
    - (void)drawRect:(CGRect)rect
    {
        CGSize frameSize = self.frame.size;
        CGSize imageSize = CGSizeZero;
        CGSize titleSize = CGSizeZero;
        NSDictionary *titleAttributes = nil;
        UIImage *backgroundImage = nil;
        UIImage *image = nil;
        CGFloat imageStartingY = 0.0f;
        
        if ([self isSelected]) {
            image = [self selectedImage];
            backgroundImage = [self selectedBackgroundImage];
            titleAttributes = [self selectedTitleAttributes];
            
            if (!titleAttributes) {
                titleAttributes = [self unselectedTitleAttributes];
            }
        } else {
            image = [self unselectedImage];
            backgroundImage = [self unselectedBackgroundImage];
            titleAttributes = [self unselectedTitleAttributes];
        }
        
        imageSize = [image size];
        
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSaveGState(context);
        [backgroundImage drawInRect:self.bounds];
        
        // Draw image and title
        
        if (![_title length]) {
            [image drawInRect:CGRectMake(roundf(frameSize.width / 2 - imageSize.width / 2) +
                                         _imagePositionAdjustment.horizontal,
                                         roundf(frameSize.height / 2 - imageSize.height / 2) +
                                         _imagePositionAdjustment.vertical,
                                         imageSize.width, imageSize.height)];
        } else {
            
            if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
                CGSize ts = CGSizeMake(frameSize.width, 20);
                titleSize = [_title boundingRectWithSize:ts
                                                 options:NSStringDrawingUsesLineFragmentOrigin
                                              attributes:titleAttributes
                                                 context:nil].size;
                
                imageStartingY = roundf((frameSize.height - imageSize.height - titleSize.height) / 2);
                CGRect frame = CGRectMake(roundf(frameSize.width / 2 - imageSize.width / 2) +
                                          _imagePositionAdjustment.horizontal,
                                          imageStartingY + _imagePositionAdjustment.vertical,
                                          imageSize.width, imageSize.height);
                [image drawInRect:frame];
    //            NSLog(@"image frame:%@,%f,%f", NSStringFromCGRect(CGRectMake(roundf(frameSize.width / 2 - imageSize.width / 2) +
    //                                                                         _imagePositionAdjustment.horizontal,
    //                                                                         imageStartingY + _imagePositionAdjustment.vertical,
    //                                                                         imageSize.width, imageSize.height)),imageStartingY,_imagePositionAdjustment.vertical);
                CGContextSetFillColorWithColor(context, [titleAttributes[NSForegroundColorAttributeName] CGColor]);
                
                CGRect frame1 = CGRectMake(roundf(frameSize.width / 2 - titleSize.width / 2) +
                                           _titlePositionAdjustment.horizontal,
                                           imageStartingY + imageSize.height + _titlePositionAdjustment.vertical,
                                           titleSize.width, titleSize.height);
    //            NSLog(@"text frame:%@", NSStringFromCGRect(frame1));
    //            NSLog(@"self frame:%@", NSStringFromCGRect(rect));
                [_title drawInRect:frame1
                    withAttributes:titleAttributes];
            } else {
    #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0
                titleSize = [_title sizeWithFont:titleAttributes[UITextAttributeFont]
                               constrainedToSize:CGSizeMake(frameSize.width, 20)];
                UIOffset titleShadowOffset = [titleAttributes[UITextAttributeTextShadowOffset] UIOffsetValue];
                imageStartingY = roundf((frameSize.height - imageSize.height - titleSize.height) / 2);
                
                [image drawInRect:CGRectMake(roundf(frameSize.width / 2 - imageSize.width / 2) +
                                             _imagePositionAdjustment.horizontal,
                                             imageStartingY + _imagePositionAdjustment.vertical,
                                             imageSize.width, imageSize.height)];
                
                CGContextSetFillColorWithColor(context, [titleAttributes[UITextAttributeTextColor] CGColor]);
                
                UIColor *shadowColor = titleAttributes[UITextAttributeTextShadowColor];
                
                if (shadowColor) {
                    CGContextSetShadowWithColor(context, CGSizeMake(titleShadowOffset.horizontal, titleShadowOffset.vertical),
                                                1.0, [shadowColor CGColor]);
                }
                
                [_title drawInRect:CGRectMake(roundf(frameSize.width / 2 - titleSize.width / 2) +
                                              _titlePositionAdjustment.horizontal,
                                              imageStartingY + imageSize.height + _titlePositionAdjustment.vertical,
                                              titleSize.width, titleSize.height)
                          withFont:titleAttributes[UITextAttributeFont]
                     lineBreakMode:NSLineBreakByTruncatingTail];
    #endif
            }
        }
        
        CGContextRestoreGState(context);
    }
    
    - (UIImage *)finishedSelectedImage
    {
      return [self selectedImage];
    }
    
    - (UIImage *)finishedUnselectedImage
    {
        return [self unselectedImage];
    }
    
    - (void)setFinishedSelectedImage:(UIImage *)selectedImage withFinishedUnselectedImage:(UIImage *)unselectedImage
    {
        if (selectedImage && (selectedImage != [self selectedImage])) {
            [self setSelectedImage:selectedImage];
        }
        
        if (unselectedImage && (unselectedImage != [self unselectedImage])) {
            [self setUnselectedImage:unselectedImage];
        }
    }
    
    
    - (UIImage *)backgroundSelectedImage {
        return [self selectedBackgroundImage];
    }
    
    - (UIImage *)backgroundUnselectedImage {
        return [self unselectedBackgroundImage];
    }
    
    - (void)setBackgroundSelectedImage:(UIImage *)selectedImage withUnselectedImage:(UIImage *)unselectedImage {
        if (selectedImage && (selectedImage != [self selectedBackgroundImage])) {
            [self setSelectedBackgroundImage:selectedImage];
        }
        
        if (unselectedImage && (unselectedImage != [self unselectedBackgroundImage])) {
            [self setUnselectedBackgroundImage:unselectedImage];
        }
    }
    
    @end
    FWEffectBarItem.m

    - (void)setFinishedSelectedImage:(UIImage *)selectedImage withFinishedUnselectedImage:(UIImage *)unselectedImage方法用来设置FWEffectBarItem的被选中和未选中时的图片

    title属性用来设置FWEffectBarItem的文字。

      二、UISlider的使用

    UIView *subview = [[UIView alloc] initWithFrame:CGRectMake(0, HEIGHT - 115 - 40, WIDTH, 40)];
        subview.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
        [self.view addSubview:subview];
        
        self.slider = [[FWSlider alloc] initWithFrame:CGRectZero];
    self.slider.minimumValue
    = -100; self.slider.maximumValue = 100; self.slider.value = 0; self.slider.frame = CGRectMake(WIDTH / 2 - 100, 10, 200, 20); [self.slider addTarget:self action:@selector(updateValue:) forControlEvents:UIControlEventTouchUpInside]; [self.slider addTarget:self action:@selector(updateTipView:) forControlEvents:UIControlEventValueChanged]; [self.slider setThumbImage:[UIImage imageNamed:@"icon_slider_thumb"] forState:UIControlStateNormal]; [subview addSubview:self.slider];

    setThumbImage用来设置滑块,该slider没有完全实现,当我们滑动的时候,没有显示当前值,有待改善

      

      四、FWBeautyProcessType枚举的定义

    typedef NS_ENUM(NSInteger, FWBeautyProcessType)
    {
        //智能优化
        FWBeautyProcessTypeAutoBeauty,
        //编辑
        FWBeautyProcessTypeEdit,
        //增强
        FWBeautyProcessTypeColorList,
        //特效
        FWBeautyProcessTypeFilter,
        //边框
        FWBeautyProcessTypeBolder,
        //魔幻笔
        FWBeautyProcessTypeMagicPen,
        //马赛克
        FWBeautyProcessTypeMosaic,
        //文字
        FWBeautyProcessTypeText,
        //背景虚化
        FWBeautyProcessTypeBlur
    };

    该枚举定义了【美化图片】下的所有功能模块,用于识别到底是哪种模块,不同模块相应的界面是不同的,请看下面代码

    - (void)setupImageView
    {
        if (self.type == FWBeautyProcessTypeAutoBeauty || self.type == FWBeautyProcessTypeColorList || self.type == FWBeautyProcessTypeEdit)
        {
            //105 = 设备高 - 关闭按钮高度 - 3段间距:30 - bar高度:55 - 的结果
            self.imageView.frame = CGRectMake(0, 0, WIDTH, HEIGHT - 115);
        }
        self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    
        [self.view addSubview:self.imageView];
    }
    
    //配置单选项卡
    - (void)setupBar
    {
        self.styleBar = [[FWEffectBar alloc] init];
        NSDictionary *autoDict = nil;
        
        if (self.type == FWBeautyProcessTypeAutoBeauty || self.type == FWBeautyProcessTypeColorList)
        {
            self.styleBar.frame = CGRectMake(0,HEIGHT - 105, WIDTH, 55);
            
            if (self.type == FWBeautyProcessTypeAutoBeauty )
                autoDict = [[FWCommonTools getPlistDictionaryForButton] objectForKey:@"AutoBeauty"];
            else
                autoDict = [[FWCommonTools getPlistDictionaryForButton] objectForKey:@"ColorValue"];
            
        }
        else if (self.type == FWBeautyProcessTypeEdit)
        {
            self.styleBar.frame = CGRectMake(100, HEIGHT - 55, 160, 55);
            
            autoDict = [[FWCommonTools getPlistDictionaryForButton] objectForKey:@"Edit"];
            
        }
        
        NSArray *normalImageArr = [autoDict objectForKey:@"normalImages"];
        NSArray *hightlightedImageArr = [autoDict objectForKey:@"HighlightedImages"];
        NSArray *textArr = [autoDict objectForKey:@"Texts"];
        
        NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:0];
        for (int i = 0; i < [textArr count]; i++)
        {
            FWEffectBarItem *item = [[FWEffectBarItem alloc] initWithFrame:CGRectZero];
            [item setFinishedSelectedImage:[UIImage imageNamed:[hightlightedImageArr objectAtIndex:i]] withFinishedUnselectedImage:[UIImage imageNamed:[normalImageArr objectAtIndex:i]] ];
            item.title = [textArr objectAtIndex:i];
            [arr addObject:item];
        }
        
        self.styleBar.items = arr;
        
        self.styleBar.delegate = self;
        [self.styleBar setSelectedItem:[self.styleBar.items objectAtIndex:0]];
        [self.view addSubview:self.styleBar];
        [self effectBar:self.styleBar didSelectItemAtIndex:0];
    }
    
    - (void)setupSliderForColorList
    {
        UIView *subview = [[UIView alloc] initWithFrame:CGRectMake(0, HEIGHT - 115 - 40, WIDTH, 40)];
        subview.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
        [self.view addSubview:subview];
        
        self.slider = [[FWSlider alloc] initWithFrame:CGRectZero];
        self.slider.minimumValue = -100;
        self.slider.maximumValue = 100;
        self.slider.value = 0;
        self.slider.frame = CGRectMake(WIDTH / 2 - 100, 10, 200, 20);
        [self.slider addTarget:self action:@selector(updateValue:) forControlEvents:UIControlEventTouchUpInside];
        [self.slider addTarget:self action:@selector(updateTipView:) forControlEvents:UIControlEventValueChanged];
        [self.slider setThumbImage:[UIImage imageNamed:@"icon_slider_thumb"] forState:UIControlStateNormal];
        
        [subview addSubview:self.slider];
        self.slider.tipView.currentValueLabel.text = [NSString stringWithFormat:@"%f",self.slider.value];
    
    }

    不同页面的方法

    - (void)displayAutoBeautyPage
    {
        [self setupImageView];
        [self setupBar];
    }
    
    - (void)displayColorListPage
    {
        [self setupImageView];
        [self setupBar];
        [self setupSliderForColorList];
    }
    
    - (void)displayEditPage
    {
        [self setupImageView];
        [self setupBar];
        [self setupButtons];
    }
     if ([text isEqualToString:@"智能优化"])
        {
            FWFunctionViewController *vc = [[FWFunctionViewController alloc] initWithImage:self.image type:FWBeautyProcessTypeAutoBeauty];
            [self presentViewController:vc animated:YES completion:^{
            }];
            [vc displayAutoBeautyPage];
        }
        else if ([text isEqualToString:@"增强"])
        {
            FWFunctionViewController *vc = [[FWFunctionViewController alloc] initWithImage:self.image type:FWBeautyProcessTypeColorList];
            [self presentViewController:vc animated:YES completion:^{
            }];
            [vc displayColorListPage];
        }
        else if ([text isEqualToString:@"编辑"]) {
            FWFunctionViewController *vc = [[FWFunctionViewController alloc] initWithImage:self.image type:FWBeautyProcessTypeEdit];
            [self presentViewController:vc animated:YES completion:^{
            }];
            [vc displayEditPage];
            
            //                CGRect frame1 = CGRectMake(87.5, 550, 200, 20);
            //                [vc setupSliderWithFrame:frame1];
        }e

      五、功能实现

    1.亮度的实现

    + (UIImage *)changeValueForBrightnessFilter:(float)value image:(UIImage *)image;
    {
        GPUImageBrightnessFilter *filter = [[GPUImageBrightnessFilter alloc] init];
        filter.brightness = value;
        [filter forceProcessingAtSize:image.size];
        GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];
        [pic addTarget:filter];
    
        [pic processImage];
        [filter useNextFrameForImageCapture];
        return [filter imageFromCurrentFramebuffer];
    }

    该功能使用了GPUImage库中的GPUImageBrightnessFilter滤镜,具体介绍请参考GPUImage简单滤镜使用(一)

    2.对比度的实现

    GPUImageContrastFilter *filter = [[GPUImageContrastFilter alloc] init];
        filter.contrast = value;
        [filter forceProcessingAtSize:image.size];
        GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];
        [pic addTarget:filter];
        
        [pic processImage];
        [filter useNextFrameForImageCapture];
        return [filter imageFromCurrentFramebuffer];

    该功能使用了GPUImage库中的GPUImageContrastFilter滤镜,具体介绍请参考GPUImage简单滤镜使用(二)

    3.色温的实现

    + (UIImage *)changeValueForWhiteBalanceFilter:(float)value image:(UIImage *)image
    {
        GPUImageWhiteBalanceFilter *filter = [[GPUImageWhiteBalanceFilter alloc] init];
        filter.temperature = value;
        filter.tint = 0.0;
        [filter forceProcessingAtSize:image.size];
        GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];
        [pic addTarget:filter];
        
        [pic processImage];
        [filter useNextFrameForImageCapture];
        return [filter imageFromCurrentFramebuffer];
    }

    该功能使用了GPUImage库中的GPUImageWhiteBalanceFilter滤镜。

    4.饱和度的实现

    + (UIImage *)changeValueForSaturationFilter:(float)value image:(UIImage *)image;
    {
        GPUImageSaturationFilter *filter = [[GPUImageSaturationFilter alloc] init];
        filter.saturation = value;
        [filter forceProcessingAtSize:image.size];
        GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];
        [pic addTarget:filter];
        
        [pic processImage];
        [filter useNextFrameForImageCapture];
        return [filter imageFromCurrentFramebuffer];
    }

    该功能使用了GPUImage库中的GPUImageSaturationFilter滤镜。

    5.高光和暗部的实现

    + (UIImage *)changeValueForHightlightFilter:(float)value image:(UIImage *)image;
    {
        GPUImageHighlightShadowFilter *filter = [[GPUImageHighlightShadowFilter alloc] init];
        filter.highlights = value;
        filter.shadows = 0.0;
        [filter forceProcessingAtSize:image.size];
        GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];
        [pic addTarget:filter];
        [pic processImage];
        [filter useNextFrameForImageCapture];
        return [filter imageFromCurrentFramebuffer];
    }
    + (UIImage *)changeValueForLowlightFilter:(float)value image:(UIImage *)image
    {
        GPUImageHighlightShadowFilter *filter = [[GPUImageHighlightShadowFilter alloc] init];
        filter.highlights = 1.0;
        filter.shadows = value;
        [filter forceProcessingAtSize:image.size];
        GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];
        [pic addTarget:filter];
        [pic processImage];
        [filter useNextFrameForImageCapture];
        return [filter imageFromCurrentFramebuffer];
    }

    该功能使用了GPUImage库中的GPUImageHighlightShadowFilter滤镜。

    6.智能补光的实现

    + (UIImage *)changeValueForExposureFilter:(float)value image:(UIImage *)image
    {
        GPUImageExposureFilter *filter = [[GPUImageExposureFilter alloc] init];
        filter.exposure = value;
        [filter forceProcessingAtSize:image.size];
        GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];
        [pic addTarget:filter];
        
        [pic processImage];
        [filter useNextFrameForImageCapture];
        return [filter imageFromCurrentFramebuffer];
    }

    该功能使用了GPUImage库中的GPUImageExposureFilter滤镜。

      我将会在以后的时间里添加几篇介绍GPUImage库中的剩余滤镜,慢慢来学习opengl es.加油,我的宝贝~上下眼皮开始打架了,睡觉喽!咦,最后附几张效果图吧

            

              原图                            亮度较暗                      对比度较高

        

                色温较冷                        饱和度较高                  高光

        

            智能补光

    下载项目

      

  • 相关阅读:
    React性能优化记录(不定期更新)
    JSX设置CSS样式详解
    org.tinygroup.htmlparser-Html解析器
    org.tinygroup.application-应用启动框架
    org.tinygroup.beancontainer-IOC、AOP框架
    org.tinygroup.vfs-虚拟文件系统
    org.tinygroup.templateengine-模板引擎
    org.tinygroup.dbfilter
    org.tinygroup.templateweb-模板文件处理器
    org.tinygroup.flow-流程引擎
  • 原文地址:https://www.cnblogs.com/salam/p/5092911.html
Copyright © 2011-2022 走看看