首页 > 代码库 > 动态将彩色图片动画过渡到黑白图片的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

 

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