- (UIImage*) blur:(UIImage*)theImage { // create our blurred image CIContext *context = [CIContext contextWithOptions:nil]; CIImage *inputImage = [CIImage imageWithCGImage:theImage.CGImage]; // setting up Gaussian Blur (could use one of many filters offered by Core Image) CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"]; [blurFilter setValue:inputImage forKey:kCIInputImageKey]; [blurFilter setValue:[NSNumber numberWithFloat:10.0f] forKey:@"inputRadius"]; CIImage *result = [blurFilter valueForKey:kCIOutputImageKey]; // CIGaussianBlur has a tendency to shrink the image a little, // this ensures it matches up exactly to the bounds of our original image CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]]; UIImage *returnImage = [UIImage imageWithCGImage:cgImage]; //create a UIImage for this function to "return" so that ARC can manage the memory of the blur... //ARC can't manage CGImageRefs so we need to release it before this function "returns" and ends. CGImageRelease(cgImage);//release CGImageRef because ARC doesn't manage this on its own. return returnImage; }
出现问题:因为在模糊的时候,边缘会变成半透明的状态,所以理想状况是可以对原图像进行适当放大,选择使用CIAffineClamp在模糊之前对图像进行处理。
- (UIImage*) blur:(UIImage*)theImage { // create our blurred image CIContext *context = [CIContext contextWithOptions:nil]; CIImage *inputImage = [CIImage imageWithCGImage:theImage.CGImage]; CIFilter *affineClampFilter = [CIFilter filterWithName:@"CIAffineClamp"]; CGAffineTransform xform = CGAffineTransformMakeScale(1.0, 1.0); [affineClampFilter setValue:inputImage forKey:kCIInputImageKey]; [affineClampFilter setValue:[NSValue valueWithBytes:&xform objCType:@encode(CGAffineTransform)] forKey:@"inputTransform"]; CIImage *extendedImage = [affineClampFilter valueForKey:kCIOutputImageKey]; // setting up Gaussian Blur (could use one of many filters offered by Core Image) CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"]; [blurFilter setValue:extendedImage forKey:kCIInputImageKey]; [blurFilter setValue:[NSNumber numberWithFloat:10.0f] forKey:@"inputRadius"]; CIImage *result = [blurFilter valueForKey:kCIOutputImageKey]; // CIGaussianBlur has a tendency to shrink the image a little, // this ensures it matches up exactly to the bounds of our original image CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]]; UIImage *returnImage = [UIImage imageWithCGImage:cgImage]; //create a UIImage for this function to "return" so that ARC can manage the memory of the blur... //ARC can't manage CGImageRefs so we need to release it before this function "returns" and ends. CGImageRelease(cgImage);//release CGImageRef because ARC doesn't manage this on its own. return returnImage; }
2.采用第三方库
https://github.com/YouXianMing/UIImageBlur
UIImage *image = [UIImage imageNamed:@"people"]; // init UIImageView UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; imageView.center = self.view.center; [self.view addSubview:imageView]; // blur Image at specified frame imageView.image = [image blurImageAtFrame:CGRectMake(0, 0, image.size.width, image.size.height / 2.f)];
3.第三种方法
利用ios8里面的UIVisualEffectView 实现模糊效果



浙公网安备 33010602011771号