动态将彩色图片动画过渡到黑白图片的BlackAndWhiteView

动态将彩色图片动画过渡到黑白图片的BlackAndWhiteView

动态将彩色图片动画过渡到黑白图片的BlackAndWhiteView

效果如下:

 BlackAndWhiteView.h 与 BlackAndWhiteView.m

//

//  BlackAndWhiteView.h

//  BlackAndWhiteView

//

//  Created by YouXianMing on 14-10-4.

//  Copyright (c) 2014年 YouXianMing. All rights reserved.

//



#import <UIKit/UIKit.h>



@interface BlackAndWhiteView : UIView



@property (nonatomic)         float    blackAlpha;

@property (nonatomic, strong) UIImage *image;



- (void)startImageProcessing;



@end
//

//  BlackAndWhiteView.m

//  BlackAndWhiteView

//

//  Created by YouXianMing on 14-10-4.

//  Copyright (c) 2014年 YouXianMing. All rights reserved.

//



#import "BlackAndWhiteView.h"



@interface BlackAndWhiteView ()



@property (nonatomic, strong) UIImageView *normalView;

@property (nonatomic, strong) UIImageView *blackView;



@property (nonatomic, strong) UIImage     *blackImage;



@end



@implementation BlackAndWhiteView



- (instancetype)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

        _normalView = [[UIImageView alloc] initWithFrame:self.bounds];

        _blackView  = [[UIImageView alloc] initWithFrame:self.bounds];

        _blackView.alpha = 0.f;

        

        [self addSubview:_normalView];

        [self addSubview:_blackView];

    }

    return self;

}



- (void)startImageProcessing

{

    if (_image) {

        _normalView.image = _image;

        

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            

            if (_blackImage == nil) {

                _blackImage = [self grayScale:_image];

            }

            

            dispatch_async(dispatch_get_main_queue(), ^{

                _blackView.image = _blackImage;

            });

        });

    }

}



#pragma mark - 私有方法

- (UIImage *)grayScale:(UIImage *)inputImage

{

    int width = inputImage.size.width;

    int height = inputImage.size.height;

    

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

    

    CGContextRef context = CGBitmapContextCreate(nil,

                                                 width,

                                                 height,

                                                 8, // bits per component

                                                 0,

                                                 colorSpace,

                                                 kCGBitmapByteOrderDefault);

    

    CGColorSpaceRelease(colorSpace);

    

    if (context == NULL) {

        return nil;

    }

    

    CGContextDrawImage(context,

                       CGRectMake(0, 0, width, height), inputImage.CGImage);

    CGImageRef image = CGBitmapContextCreateImage(context);

    UIImage *grayImage = [UIImage imageWithCGImage:image];

    CFRelease(image);

    CGContextRelease(context);

    

    return grayImage;

}



#pragma mark - 重写setter方法

@synthesize blackAlpha = _blackAlpha;

- (void)setBlackAlpha:(float)blackAlpha

{

    _blackAlpha      = blackAlpha;

    _blackView.alpha = blackAlpha;

}



- (float)blackAlpha

{

    return _blackAlpha;

}



@end

使用的源码:

//

//  ViewController.m

//  BlackAndWhiteView

//

//  Created by YouXianMing on 14-10-4.

//  Copyright (c) 2014年 YouXianMing. All rights reserved.

//



#import "ViewController.h"

#import "BlackAndWhiteView.h"



@interface ViewController ()



@property (nonatomic, strong) BlackAndWhiteView *blackView;



@end



@implementation ViewController



- (void)viewDidLoad {

    [super viewDidLoad];

 

    UIImage *image   = [UIImage imageNamed:@"red.jpg"];

    _blackView = [[BlackAndWhiteView alloc] initWithFrame:CGRectMake(0, 0,

                                                                     image.size.width,

                                                                     image.size.height)];

    _blackView.image  = image;

    _blackView.center = self.view.center;

    [_blackView startImageProcessing];

    [self.view addSubview:_blackView];

    

    [self performSelector:@selector(run) withObject:nil afterDelay:8];

}



- (void)run

{

    [UIView animateWithDuration:2 animations:^{

        _blackView.blackAlpha = 1.f;

    }];

}



@end

 

你可能感兴趣的:(view)