亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS7 毛玻璃特效代碼

2020-07-26 03:36:17
字體:
來源:轉載
供稿:網友

原圖:


效果圖:

 實現:
首先需要導入Accelerate.framework。
然后把兩個文件加入到自己的項目中即可。
UIImage+ImageEffects.h

復制代碼 代碼如下:

#import
@interfaceUIImage(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 "UIImage+ImageEffects.h"
#import
#import
@implementationUIImage(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
{
constCGFloatEffectColorAlpha=0.6;
UIColor*effectColor = tintColor;
int componentCount =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);
returnnil;
}
if(!self.CGImage){
NSLog(@"*** error: image must be backed by a CGImage: %@",self);
returnnil;
}
if(maskImage &&!maskImage.CGImage){
NSLog(@"*** error: maskImage must be backed by a CGImage: %@", maskImage);
returnnil;
}
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){
// A description of how to compute the box kernel width from the Gaussian
// radius (aka standard deviation) appears in the SVG spec:
// http://www.w3.org/TR/SVG/filters.html#feGaussianBlurElement
//
// For larger values of 's' (s >= 2.0), an approximation can be used: Three
// successive box-blurs build a piece-wise quadratic convolution kernel, which
// approximates the Gaussian kernel to within roughly 3%.
//
// let d = floor(s * 3*sqrt(2*pi)/4 + 0.5)
//
// ... if d is odd, use three box-blurs of size 'd', centered on the output pixel.
//
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, radius, radius,0, kvImageEdgeExtend);
vImageBoxConvolve_ARGB8888(&effectOutBuffer,&effectInBuffer, NULL,0,0, radius, radius,0, kvImageEdgeExtend);
vImageBoxConvolve_ARGB8888(&effectInBuffer,&effectOutBuffer, NULL,0,0, radius, 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,
};
constint32_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

調用:
 

復制代碼 代碼如下:

UIImageView*me =[[UIImageView alloc] initWithFrame:CGRectMake(10,480,614,381)];
[me setImage:[[UIImage imageNamed:@"me.png"] applyBlurWithRadius:5 tintColor:[UIColor colorWithWhite:1 alpha:0.2] saturationDeltaFactor:1.8 maskImage:nil]];
[self.view addSubview:me];

ok!So easy!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲大胆人体在线| 国产99久久精品一区二区| 97人洗澡人人免费公开视频碰碰碰| 国产精品永久免费观看| 精品亚洲一区二区三区在线观看| 久久久久久网站| 欧美精品日韩三级| 亚洲第一色在线| 久久成人精品电影| 精品视频www| 在线免费观看羞羞视频一区二区| 日本国产高清不卡| 91久久精品视频| 亚洲一区亚洲二区| 久久频这里精品99香蕉| 久久国产精品免费视频| 欧美色欧美亚洲高清在线视频| 欧美激情图片区| 亚洲91精品在线| 久久99久久亚洲国产| 成人免费观看49www在线观看| 成人免费视频97| 国产精品日韩电影| 国产精品午夜国产小视频| 国产一区二区丝袜高跟鞋图片| 在线观看不卡av| 亚洲的天堂在线中文字幕| 亚洲精品一区二区三区婷婷月| 国产欧美日韩中文字幕在线| 欧美性高跟鞋xxxxhd| 夜夜嗨av一区二区三区免费区| 成人免费在线视频网址| 国产女人精品视频| 国产精品美女主播在线观看纯欲| 日韩女优人人人人射在线视频| 欧美精品videossex性护士| 欧美最猛性xxxx| 久久精品国产视频| 亚洲成av人片在线观看香蕉| 精品精品国产国产自在线| 国产一区欧美二区三区| 色视频www在线播放国产成人| 91精品国产91久久久久久| 亚洲激情国产精品| 欧美日韩午夜剧场| 成人网欧美在线视频| 国产精品扒开腿做爽爽爽的视频| 97在线免费观看| 亚洲影影院av| 日韩精品极品视频免费观看| 一个色综合导航| 久久国产天堂福利天堂| 亚洲91精品在线观看| 亚洲一区二区三区xxx视频| 国产精品中文在线| 国产日韩欧美在线播放| 亚洲欧美国产另类| 亚洲激情在线观看视频免费| 国产精品久久久久久久久久久不卡| 亚洲四色影视在线观看| 精品视频在线播放色网色视频| 日本免费久久高清视频| 日韩精品电影网| 原创国产精品91| 91九色蝌蚪国产| 亚洲第一网站免费视频| 国内精久久久久久久久久人| 中文字幕日韩高清| 欧美中文字幕在线视频| 中文字幕久久亚洲| 超薄丝袜一区二区| 欧美激情视频网站| 亚洲一区999| 中文字幕不卡在线视频极品| 日产精品久久久一区二区福利| 亚洲精品国产电影| 庆余年2免费日韩剧观看大牛| 国产成人精品免费久久久久| 国产亚洲精品美女久久久| 亚洲另类激情图| 久久久久久久一区二区| 91精品国产精品| 日韩欧美中文在线| 国产精品高潮呻吟视频| 国产亚洲欧美日韩精品| 国产精品免费一区豆花| 黑人精品xxx一区一二区| 亚洲精品成人久久电影| 午夜精品久久久久久久99热浪潮| 中文字幕欧美日韩va免费视频| 日本道色综合久久影院| 免费97视频在线精品国自产拍| 国产精品入口福利| 欧美激情视频在线| 久久九九热免费视频| 国产成人+综合亚洲+天堂| 久久亚洲精品视频| 美女福利精品视频| 国产精品成人观看视频国产奇米| 日韩电影视频免费| 日韩有码在线播放| 国产精品爽爽爽爽爽爽在线观看| 久久露脸国产精品| 日韩在线免费观看视频| 亚洲欧美精品伊人久久| 亚洲精品第一页| 狠狠躁夜夜躁人人爽超碰91| 中文字幕亚洲天堂| 91精品在线国产| 欧美日韩高清在线观看| 国产成人福利夜色影视| 欧美裸体xxxx| 亚洲精品国产综合久久| 亚洲aa中文字幕| 91精品久久久久久久久中文字幕| 91经典在线视频| 国产91色在线免费| 久久久久久久久久久久久久久久久久av| 久久色免费在线视频| 97成人精品视频在线观看| 日韩美女免费视频| 日韩亚洲国产中文字幕| 久久资源免费视频| 国产精品久久久久99| 久久福利视频网| 国产精品福利在线观看网址| 色伦专区97中文字幕| 精品国产91久久久久久| 国产精品一区=区| 欧美成人午夜影院| 亚洲美女www午夜| 国产精品露脸av在线| 国产精品久久久久久久9999| 久久久久久高潮国产精品视| 欧美日韩中文字幕在线| 亚洲视频一区二区三区| 国产剧情久久久久久| 中文字幕精品久久| 日本免费一区二区三区视频观看| 欧美中文字幕在线视频| 亚洲深夜福利网站| 不卡在线观看电视剧完整版| 成人福利视频在线观看| 91久久精品国产| 国产精品夜色7777狼人| 91国产视频在线播放| 91国产高清在线| 日韩av免费一区| 91在线免费看网站| 久久电影一区二区| 久久综合久久88| 欧美多人乱p欧美4p久久| 成人午夜在线观看| 这里只有精品在线观看| 亚洲欧美日韩一区二区在线| 亚洲欧美日韩一区二区三区在线| 日韩美女在线观看| 国产日产久久高清欧美一区| 国产精品久久久久高潮| 中文字幕精品久久久久| 日本不卡免费高清视频| 久久久久免费视频| 久久色在线播放| 日韩中文理论片|