iOS -- 图片虚化,模糊化
2015-09-28 16:22
459 查看
首先需要导入1个类代码如下:
UIImage+Blur.h
#import <UIKit/UIKit.h>
#import <Accelerate/Accelerate.h>
#import <QuartzCore/QuartzCore.h>
@interface UIImage (Blur)
// 0.0 to 1.0
- (UIImage*)blurredImage:(CGFloat)blurAmount;
@end
UIImage+Blur.m
#import "UIImage+Blur.h"
@implementation UIImage (Blur)
- (UIImage*)blurredImage:(CGFloat)blurAmount
{
if (blurAmount < 0.0 || blurAmount >
1.0) {
blurAmount =
0.5;
}
int boxSize = (int)(blurAmount *
40);
boxSize = boxSize - (boxSize %
2) + 1;
CGImageRef img =
self.CGImage;
vImage_Buffer inBuffer, outBuffer;
vImage_Error error;
void *pixelBuffer;
CGDataProviderRef inProvider =
CGImageGetDataProvider(img);
CFDataRef inBitmapData =
CGDataProviderCopyData(inProvider);
inBuffer.width =
CGImageGetWidth(img);
inBuffer.height =
CGImageGetHeight(img);
inBuffer.rowBytes =
CGImageGetBytesPerRow(img);
inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
pixelBuffer = malloc(CGImageGetBytesPerRow(img) *
CGImageGetHeight(img));
outBuffer.data = pixelBuffer;
outBuffer.width =
CGImageGetWidth(img);
outBuffer.height =
CGImageGetHeight(img);
outBuffer.rowBytes =
CGImageGetBytesPerRow(img);
error =
vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer,
NULL, 0,
0, boxSize, boxSize, NULL,
kvImageEdgeExtend);
if (!error) {
error =
vImageBoxConvolve_ARGB8888(&outBuffer, &inBuffer,
NULL, 0,
0, boxSize, boxSize, NULL,
kvImageEdgeExtend);
if (!error) {
error =
vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer,
NULL, 0,
0, boxSize, boxSize, NULL,
kvImageEdgeExtend);
}
}
CGColorSpaceRef colorSpace =
CGColorSpaceCreateDeviceRGB();
CGContextRef ctx =
CGBitmapContextCreate(outBuffer.data,
outBuffer.width,
outBuffer.height,
8,
outBuffer.rowBytes,
colorSpace,
(CGBitmapInfo)kCGImageAlphaNoneSkipLast);
CGImageRef imageRef =
CGBitmapContextCreateImage (ctx);
UIImage *returnImage = [UIImage
imageWithCGImage:imageRef];
CGContextRelease(ctx);
CGColorSpaceRelease(colorSpace);
free(pixelBuffer);
CFRelease(inBitmapData);
CGColorSpaceRelease(colorSpace);
CGImageRelease(imageRef);
return returnImage;
}
@end
用法:
再viewController里写如下代码
#import "ViewController.h"
#import "UIImage+Blur.h"
@interface
ViewController ()
{
UIImageView *imageViewNormal;
UIImageView *imageViewBlurred;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
imageViewNormal = [[UIImageView
alloc]initWithFrame:CGRectMake(0,
30,
320, 200)];
imageViewNormal.image = [UIImage
imageNamed:@"bg.jpg"];
//imageViewNormal.backgroundColor = [UIColor redColor];
[self.view
addSubview:imageViewNormal];
imageViewBlurred = [[UIImageView
alloc] initWithFrame:CGRectMake(0,
240,
320, 200)];
float quality = .00001f;
float blurred = .5f;
NSData *imageData =
UIImageJPEGRepresentation([imageViewNormal
image], quality);
UIImage *blurredImage = [[UIImage
imageWithData:imageData]
blurredImage:blurred];
imageViewBlurred.image = blurredImage;
[self.view
addSubview:imageViewBlurred];
}
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
效果如下:
UIImage+Blur.h
#import <UIKit/UIKit.h>
#import <Accelerate/Accelerate.h>
#import <QuartzCore/QuartzCore.h>
@interface UIImage (Blur)
// 0.0 to 1.0
- (UIImage*)blurredImage:(CGFloat)blurAmount;
@end
UIImage+Blur.m
#import "UIImage+Blur.h"
@implementation UIImage (Blur)
- (UIImage*)blurredImage:(CGFloat)blurAmount
{
if (blurAmount < 0.0 || blurAmount >
1.0) {
blurAmount =
0.5;
}
int boxSize = (int)(blurAmount *
40);
boxSize = boxSize - (boxSize %
2) + 1;
CGImageRef img =
self.CGImage;
vImage_Buffer inBuffer, outBuffer;
vImage_Error error;
void *pixelBuffer;
CGDataProviderRef inProvider =
CGImageGetDataProvider(img);
CFDataRef inBitmapData =
CGDataProviderCopyData(inProvider);
inBuffer.width =
CGImageGetWidth(img);
inBuffer.height =
CGImageGetHeight(img);
inBuffer.rowBytes =
CGImageGetBytesPerRow(img);
inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
pixelBuffer = malloc(CGImageGetBytesPerRow(img) *
CGImageGetHeight(img));
outBuffer.data = pixelBuffer;
outBuffer.width =
CGImageGetWidth(img);
outBuffer.height =
CGImageGetHeight(img);
outBuffer.rowBytes =
CGImageGetBytesPerRow(img);
error =
vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer,
NULL, 0,
0, boxSize, boxSize, NULL,
kvImageEdgeExtend);
if (!error) {
error =
vImageBoxConvolve_ARGB8888(&outBuffer, &inBuffer,
NULL, 0,
0, boxSize, boxSize, NULL,
kvImageEdgeExtend);
if (!error) {
error =
vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer,
NULL, 0,
0, boxSize, boxSize, NULL,
kvImageEdgeExtend);
}
}
CGColorSpaceRef colorSpace =
CGColorSpaceCreateDeviceRGB();
CGContextRef ctx =
CGBitmapContextCreate(outBuffer.data,
outBuffer.width,
outBuffer.height,
8,
outBuffer.rowBytes,
colorSpace,
(CGBitmapInfo)kCGImageAlphaNoneSkipLast);
CGImageRef imageRef =
CGBitmapContextCreateImage (ctx);
UIImage *returnImage = [UIImage
imageWithCGImage:imageRef];
CGContextRelease(ctx);
CGColorSpaceRelease(colorSpace);
free(pixelBuffer);
CFRelease(inBitmapData);
CGColorSpaceRelease(colorSpace);
CGImageRelease(imageRef);
return returnImage;
}
@end
用法:
再viewController里写如下代码
#import "ViewController.h"
#import "UIImage+Blur.h"
@interface
ViewController ()
{
UIImageView *imageViewNormal;
UIImageView *imageViewBlurred;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
imageViewNormal = [[UIImageView
alloc]initWithFrame:CGRectMake(0,
30,
320, 200)];
imageViewNormal.image = [UIImage
imageNamed:@"bg.jpg"];
//imageViewNormal.backgroundColor = [UIColor redColor];
[self.view
addSubview:imageViewNormal];
imageViewBlurred = [[UIImageView
alloc] initWithFrame:CGRectMake(0,
240,
320, 200)];
float quality = .00001f;
float blurred = .5f;
NSData *imageData =
UIImageJPEGRepresentation([imageViewNormal
image], quality);
UIImage *blurredImage = [[UIImage
imageWithData:imageData]
blurredImage:blurred];
imageViewBlurred.image = blurredImage;
[self.view
addSubview:imageViewBlurred];
}
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
效果如下:
相关文章推荐
- iOS9新特性——3Dtouchaa
- xcode7 ios9 适配 错误
- Ios小记整理
- ios开发一些零碎的小知识(二)
- ios9企业证书提示“未受信任的企业级开发者”解决方法
- 平时用的到的方法
- iOS证书整理
- 野鸟装备iOS版开发笔记(1.5.0)
- iOS 9正式发布了
- iOS 9适配
- iOS本地通知
- 项目里出现的问题 01(声明这张图片用原图 别渲染) (随机颜色) (自定义Log) (查找当前ios系统版本是多少)
- iOS-多线程(2)
- iOS 数据的存储和读取之归档
- iOS侧滑返回上一级界面
- iOS开发日记26-详解时间戳
- [iOS学习]函数的定义,函数的调用以及函数的声明
- iOS绘图教程
- iOS本地的缓存的方式
- Error:IOS集成支付宝出现的错误