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