IOS7模糊化处理
2014-03-25 11:23
134 查看
效果图
导入Accelerate.framework库
创建UIImage+ImageEffects.h和UIImage+ImageEffects.m文件
UIImage+ImageEffects.h源码
#import <UIKit/UIKit.h>
@interface UIImage (ImageEffects)
- (UIImage *)applyLightEffect;
- (UIImage *)applyExtraLightEffect;
- (UIImage *)applyDarkEffect;
- (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor;
- (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor
maskImage:(UIImage *)maskImage;
@end
UIImage+ImageEffects.m源码
#import <float.h>
#import <Accelerate/Accelerate.h>
#import "UIImage+ImageEffects.h"
@implementation UIImage (ImageEffects)
- (UIImage *)applyLightEffect
{
UIColor *tintColor = [UIColor
colorWithWhite:1.0
alpha:0.3];
return [self
applyBlurWithRadius:30
tintColor:tintColor saturationDeltaFactor:1.8
maskImage:nil];
}
- (UIImage *)applyExtraLightEffect
{
UIColor *tintColor = [UIColor
colorWithWhite:0.97
alpha:0.82];
return [self
applyBlurWithRadius:20
tintColor:tintColor saturationDeltaFactor:1.8
maskImage:nil];
}
- (UIImage *)applyDarkEffect
{
UIColor *tintColor = [UIColor
colorWithWhite:0.11
alpha:0.73];
return [self
applyBlurWithRadius:20
tintColor:tintColor saturationDeltaFactor:1.8
maskImage:nil];
}
- (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor
{
const CGFloat EffectColorAlpha =
0.6;
UIColor *effectColor = tintColor;
int componentCount = (int)CGColorGetNumberOfComponents(tintColor.CGColor);
if (componentCount ==
2) {
CGFloat b;
if ([tintColor
getWhite:&b alpha:NULL]) {
effectColor = [UIColor
colorWithWhite:b alpha:EffectColorAlpha];
}
}
else {
CGFloat r, g, b;
if ([tintColor
getRed:&r green:&g
blue:&b alpha:NULL]) {
effectColor = [UIColor
colorWithRed:r green:g
blue:b alpha:EffectColorAlpha];
}
}
return [self
applyBlurWithRadius:10
tintColor:effectColor saturationDeltaFactor:-1.0
maskImage:nil];
}
- (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor
maskImage:(UIImage *)maskImage
{
// check pre-conditions
if (self.size.width <
1 || self.size.height <
1) {
NSLog (@"*** error: invalid size: (%.2f x %.2f). Both dimensions must be >= 1: %@",
self.size.width,
self.size.height,
self);
return nil;
}
if (!self.CGImage) {
NSLog (@"*** error: image must be backed by a CGImage: %@",
self);
return nil;
}
if (maskImage && !maskImage.CGImage) {
NSLog (@"*** error: maskImage must be backed by a CGImage: %@", maskImage);
return nil;
}
CGRect imageRect = {
CGPointZero, self.size };
UIImage *effectImage =
self;
BOOL hasBlur = blurRadius >
__FLT_EPSILON__;
BOOL hasSaturationChange =
fabs(saturationDeltaFactor - 1.) >
__FLT_EPSILON__;
if (hasBlur || hasSaturationChange) {
UIGraphicsBeginImageContextWithOptions(self.size,
NO, [[UIScreen
mainScreen] scale]);
CGContextRef effectInContext =
UIGraphicsGetCurrentContext();
CGContextScaleCTM(effectInContext,
1.0, -1.0);
CGContextTranslateCTM(effectInContext,
0, -self.size.height);
CGContextDrawImage(effectInContext, imageRect,
self.CGImage);
vImage_Buffer effectInBuffer;
effectInBuffer.data =
CGBitmapContextGetData(effectInContext);
effectInBuffer.width =
CGBitmapContextGetWidth(effectInContext);
effectInBuffer.height =
CGBitmapContextGetHeight(effectInContext);
effectInBuffer.rowBytes =
CGBitmapContextGetBytesPerRow(effectInContext);
UIGraphicsBeginImageContextWithOptions(self.size,
NO, [[UIScreen
mainScreen] scale]);
CGContextRef effectOutContext =
UIGraphicsGetCurrentContext();
vImage_Buffer effectOutBuffer;
effectOutBuffer.data =
CGBitmapContextGetData(effectOutContext);
effectOutBuffer.width =
CGBitmapContextGetWidth(effectOutContext);
effectOutBuffer.height =
CGBitmapContextGetHeight(effectOutContext);
effectOutBuffer.rowBytes =
CGBitmapContextGetBytesPerRow(effectOutContext);
if (hasBlur) {
CGFloat inputRadius = blurRadius * [[UIScreen
mainScreen] scale];
NSUInteger radius =
floor(inputRadius * 3. *
sqrt(2 * M_PI) /
4 + 0.5);
if (radius %
2 != 1) {
radius += 1;
// force radius to be odd so that the three box-blur methodology works.
}
vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer,
NULL, 0,
0, (uint32_t)radius, (uint32_t)radius,
0, kvImageEdgeExtend);
vImageBoxConvolve_ARGB8888(&effectOutBuffer, &effectInBuffer,
NULL, 0,
0, (uint32_t)radius, (uint32_t)radius,
0, kvImageEdgeExtend);
vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer,
NULL, 0,
0, (uint32_t)radius, (uint32_t)radius,
0, kvImageEdgeExtend);
}
BOOL effectImageBuffersAreSwapped =
NO;
if (hasSaturationChange) {
CGFloat s = saturationDeltaFactor;
CGFloat floatingPointSaturationMatrix[] = {
0.0722 +
0.9278 * s, 0.0722 -
0.0722 * s, 0.0722 -
0.0722 * s, 0,
0.7152 -
0.7152 * s, 0.7152 +
0.2848 * s, 0.7152 -
0.7152 * s, 0,
0.2126 -
0.2126 * s, 0.2126 -
0.2126 * s, 0.2126 +
0.7873 * s, 0,
0,
0,
0, 1,
};
const
int32_t divisor = 256;
NSUInteger matrixSize =
sizeof(floatingPointSaturationMatrix)/sizeof(floatingPointSaturationMatrix[0]);
int16_t saturationMatrix[matrixSize];
for (NSUInteger i =
0; i < matrixSize; ++i) {
saturationMatrix[i] = (int16_t)roundf(floatingPointSaturationMatrix[i] * divisor);
}
if (hasBlur) {
vImageMatrixMultiply_ARGB8888(&effectOutBuffer, &effectInBuffer, saturationMatrix, divisor,
NULL, NULL,
kvImageNoFlags);
effectImageBuffersAreSwapped = YES;
}
else {
vImageMatrixMultiply_ARGB8888(&effectInBuffer, &effectOutBuffer, saturationMatrix, divisor,
NULL, NULL,
kvImageNoFlags);
}
}
if (!effectImageBuffersAreSwapped)
effectImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
if (effectImageBuffersAreSwapped)
effectImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
// set up output context
UIGraphicsBeginImageContextWithOptions(self.size,
NO, [[UIScreen
mainScreen] scale]);
CGContextRef outputContext =
UIGraphicsGetCurrentContext();
CGContextScaleCTM(outputContext,
1.0, -1.0);
CGContextTranslateCTM(outputContext,
0, -self.size.height);
// draw base image
CGContextDrawImage(outputContext, imageRect,
self.CGImage);
// draw effect image
if (hasBlur) {
CGContextSaveGState(outputContext);
if (maskImage) {
CGContextClipToMask(outputContext, imageRect, maskImage.CGImage);
}
CGContextDrawImage(outputContext, imageRect, effectImage.CGImage);
CGContextRestoreGState(outputContext);
}
// add in color tint
if (tintColor) {
CGContextSaveGState(outputContext);
CGContextSetFillColorWithColor(outputContext, tintColor.CGColor);
CGContextFillRect(outputContext, imageRect);
CGContextRestoreGState(outputContext);
}
// output image is ready
UIImage *outputImage =
UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return outputImage;
}
@end
源码demo下载
导入Accelerate.framework库
创建UIImage+ImageEffects.h和UIImage+ImageEffects.m文件
UIImage+ImageEffects.h源码
#import <UIKit/UIKit.h>
@interface UIImage (ImageEffects)
- (UIImage *)applyLightEffect;
- (UIImage *)applyExtraLightEffect;
- (UIImage *)applyDarkEffect;
- (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor;
- (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor
maskImage:(UIImage *)maskImage;
@end
UIImage+ImageEffects.m源码
#import <float.h>
#import <Accelerate/Accelerate.h>
#import "UIImage+ImageEffects.h"
@implementation UIImage (ImageEffects)
- (UIImage *)applyLightEffect
{
UIColor *tintColor = [UIColor
colorWithWhite:1.0
alpha:0.3];
return [self
applyBlurWithRadius:30
tintColor:tintColor saturationDeltaFactor:1.8
maskImage:nil];
}
- (UIImage *)applyExtraLightEffect
{
UIColor *tintColor = [UIColor
colorWithWhite:0.97
alpha:0.82];
return [self
applyBlurWithRadius:20
tintColor:tintColor saturationDeltaFactor:1.8
maskImage:nil];
}
- (UIImage *)applyDarkEffect
{
UIColor *tintColor = [UIColor
colorWithWhite:0.11
alpha:0.73];
return [self
applyBlurWithRadius:20
tintColor:tintColor saturationDeltaFactor:1.8
maskImage:nil];
}
- (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor
{
const CGFloat EffectColorAlpha =
0.6;
UIColor *effectColor = tintColor;
int componentCount = (int)CGColorGetNumberOfComponents(tintColor.CGColor);
if (componentCount ==
2) {
CGFloat b;
if ([tintColor
getWhite:&b alpha:NULL]) {
effectColor = [UIColor
colorWithWhite:b alpha:EffectColorAlpha];
}
}
else {
CGFloat r, g, b;
if ([tintColor
getRed:&r green:&g
blue:&b alpha:NULL]) {
effectColor = [UIColor
colorWithRed:r green:g
blue:b alpha:EffectColorAlpha];
}
}
return [self
applyBlurWithRadius:10
tintColor:effectColor saturationDeltaFactor:-1.0
maskImage:nil];
}
- (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor
maskImage:(UIImage *)maskImage
{
// check pre-conditions
if (self.size.width <
1 || self.size.height <
1) {
NSLog (@"*** error: invalid size: (%.2f x %.2f). Both dimensions must be >= 1: %@",
self.size.width,
self.size.height,
self);
return nil;
}
if (!self.CGImage) {
NSLog (@"*** error: image must be backed by a CGImage: %@",
self);
return nil;
}
if (maskImage && !maskImage.CGImage) {
NSLog (@"*** error: maskImage must be backed by a CGImage: %@", maskImage);
return nil;
}
CGRect imageRect = {
CGPointZero, self.size };
UIImage *effectImage =
self;
BOOL hasBlur = blurRadius >
__FLT_EPSILON__;
BOOL hasSaturationChange =
fabs(saturationDeltaFactor - 1.) >
__FLT_EPSILON__;
if (hasBlur || hasSaturationChange) {
UIGraphicsBeginImageContextWithOptions(self.size,
NO, [[UIScreen
mainScreen] scale]);
CGContextRef effectInContext =
UIGraphicsGetCurrentContext();
CGContextScaleCTM(effectInContext,
1.0, -1.0);
CGContextTranslateCTM(effectInContext,
0, -self.size.height);
CGContextDrawImage(effectInContext, imageRect,
self.CGImage);
vImage_Buffer effectInBuffer;
effectInBuffer.data =
CGBitmapContextGetData(effectInContext);
effectInBuffer.width =
CGBitmapContextGetWidth(effectInContext);
effectInBuffer.height =
CGBitmapContextGetHeight(effectInContext);
effectInBuffer.rowBytes =
CGBitmapContextGetBytesPerRow(effectInContext);
UIGraphicsBeginImageContextWithOptions(self.size,
NO, [[UIScreen
mainScreen] scale]);
CGContextRef effectOutContext =
UIGraphicsGetCurrentContext();
vImage_Buffer effectOutBuffer;
effectOutBuffer.data =
CGBitmapContextGetData(effectOutContext);
effectOutBuffer.width =
CGBitmapContextGetWidth(effectOutContext);
effectOutBuffer.height =
CGBitmapContextGetHeight(effectOutContext);
effectOutBuffer.rowBytes =
CGBitmapContextGetBytesPerRow(effectOutContext);
if (hasBlur) {
CGFloat inputRadius = blurRadius * [[UIScreen
mainScreen] scale];
NSUInteger radius =
floor(inputRadius * 3. *
sqrt(2 * M_PI) /
4 + 0.5);
if (radius %
2 != 1) {
radius += 1;
// force radius to be odd so that the three box-blur methodology works.
}
vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer,
NULL, 0,
0, (uint32_t)radius, (uint32_t)radius,
0, kvImageEdgeExtend);
vImageBoxConvolve_ARGB8888(&effectOutBuffer, &effectInBuffer,
NULL, 0,
0, (uint32_t)radius, (uint32_t)radius,
0, kvImageEdgeExtend);
vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer,
NULL, 0,
0, (uint32_t)radius, (uint32_t)radius,
0, kvImageEdgeExtend);
}
BOOL effectImageBuffersAreSwapped =
NO;
if (hasSaturationChange) {
CGFloat s = saturationDeltaFactor;
CGFloat floatingPointSaturationMatrix[] = {
0.0722 +
0.9278 * s, 0.0722 -
0.0722 * s, 0.0722 -
0.0722 * s, 0,
0.7152 -
0.7152 * s, 0.7152 +
0.2848 * s, 0.7152 -
0.7152 * s, 0,
0.2126 -
0.2126 * s, 0.2126 -
0.2126 * s, 0.2126 +
0.7873 * s, 0,
0,
0,
0, 1,
};
const
int32_t divisor = 256;
NSUInteger matrixSize =
sizeof(floatingPointSaturationMatrix)/sizeof(floatingPointSaturationMatrix[0]);
int16_t saturationMatrix[matrixSize];
for (NSUInteger i =
0; i < matrixSize; ++i) {
saturationMatrix[i] = (int16_t)roundf(floatingPointSaturationMatrix[i] * divisor);
}
if (hasBlur) {
vImageMatrixMultiply_ARGB8888(&effectOutBuffer, &effectInBuffer, saturationMatrix, divisor,
NULL, NULL,
kvImageNoFlags);
effectImageBuffersAreSwapped = YES;
}
else {
vImageMatrixMultiply_ARGB8888(&effectInBuffer, &effectOutBuffer, saturationMatrix, divisor,
NULL, NULL,
kvImageNoFlags);
}
}
if (!effectImageBuffersAreSwapped)
effectImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
if (effectImageBuffersAreSwapped)
effectImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
// set up output context
UIGraphicsBeginImageContextWithOptions(self.size,
NO, [[UIScreen
mainScreen] scale]);
CGContextRef outputContext =
UIGraphicsGetCurrentContext();
CGContextScaleCTM(outputContext,
1.0, -1.0);
CGContextTranslateCTM(outputContext,
0, -self.size.height);
// draw base image
CGContextDrawImage(outputContext, imageRect,
self.CGImage);
// draw effect image
if (hasBlur) {
CGContextSaveGState(outputContext);
if (maskImage) {
CGContextClipToMask(outputContext, imageRect, maskImage.CGImage);
}
CGContextDrawImage(outputContext, imageRect, effectImage.CGImage);
CGContextRestoreGState(outputContext);
}
// add in color tint
if (tintColor) {
CGContextSaveGState(outputContext);
CGContextSetFillColorWithColor(outputContext, tintColor.CGColor);
CGContextFillRect(outputContext, imageRect);
CGContextRestoreGState(outputContext);
}
// output image is ready
UIImage *outputImage =
UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return outputImage;
}
@end
源码demo下载
相关文章推荐
- bios里super password灰色的设置方法
- iOS多线程编程:线程同步总结 NSCondtion
- IOS 保留小数点后几位
- ios动画模拟旋转加载
- iOS 开发中常用的xml解析器比较
- iOS系列译文:深入理解 CocoaPods
- iOS应用发布流程
- iOS 非ARC基本内存管理系列 2-多对象内存管理(1)
- iOS 分类思想(1)
- iOS Foundation框架 -2.常用集合类简单总结
- iOS Foundation框架 -1.常用结构体的用法和输出
- iOS:.NSRunLoop再理解
- 使用CocoaPods来做iOS程序的包依赖管理
- ios 内存管理原则
- iOS开发-点击屏幕,键盘消失的极佳方法。
- ios 编码转换 保存文件
- IOS数组按中文关键字以字母序排序(稍后添加 demo)
- 一种在BIOS中嵌入应用程序的方法及实现
- 一种在BIOS中嵌入应用程序的方法及实现
- 一种在BIOS中嵌入应用程序的方法及实现