您的位置:首页 > 其它

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

2014-10-04 22:17 453 查看
动态将彩色图片动画过渡到黑白图片的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: