广

IOS开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    iOS7 毛玻璃特效代码

    2018-04-03 22:30:35 次阅读 稿源:互联网
    广告

    原图:


    效果图:

     实现:
    首先需要导入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!

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告