源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

iOS7 毛玻璃特效代码

  • 时间:2020-07-23 22:48 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:iOS7 毛玻璃特效代码
原图: [img]http://files.jb51.net/file_images/article/201410/20141026163258444.jpg?2014926163329[/img] 效果图: [img]http://files.jb51.net/file_images/article/201410/20141026163341610.jpg?2014926163357[/img]  实现: 首先需要导入Accelerate.framework。 然后把两个文件加入到自己的项目中即可。 UIImage+ImageEffects.h
%@",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: // [url=http://www.w3.org/TR/SVG/filters.html#feGaussianBlurElement]http://www.w3.org/TR/SVG/filters.html#feGaussianBlurElement[/url] // // 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
调用:  
[u]复制代码[/u] 代码如下:
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!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部