您的位置:首页 > 移动开发 > IOS开发

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下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: