In my iPhone application I have a black-and-white UIImage
. I need to blur that image (Gaussian blur would do).
iPhone clearly knows how to blur images, as it does that when it draws shadows.
However I did not found anything related in the API.
Do I have to do blurring by hand, without hardware acceleration?
Try this (found here):
@interface UIImage (ImageBlur)
- (UIImage *)imageWithGaussianBlur;
@end
@implementation UIImage (ImageBlur)
- (UIImage *)imageWithGaussianBlur {
float weight[5] = {0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162};
// Blur horizontally
UIGraphicsBeginImageContext(self.size);
[self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[0]];
for (int x = 1; x < 5; ++x) {
[self drawInRect:CGRectMake(x, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[x]];
[self drawInRect:CGRectMake(-x, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[x]];
}
UIImage *horizBlurredImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// Blur vertically
UIGraphicsBeginImageContext(self.size);
[horizBlurredImage drawInRect:CGRectMake(0, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[0]];
for (int y = 1; y < 5; ++y) {
[horizBlurredImage drawInRect:CGRectMake(0, y, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[y]];
[horizBlurredImage drawInRect:CGRectMake(0, -y, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[y]];
}
UIImage *blurredImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//
return blurredImage;
}
And use it like this:
UIImage *blurredImage = [originalImage imageWithGaussianBlur];
To get stronger blur just apply this effect twice or more :)
After having the same problem by the past, check this lib:
https://github.com/tomsoft1/StackBluriOS
Very easy to use also:
UIImage *newIma=[oldIma stackBlur:radius];
Consider approaching the job via CIFilter:
Basically there is no a straight forward API to implement the blur effect. You need to process the pixels to accomplish that.
iPhone draw shadows by means of gradient and not through blurring.
To blur an image, you would use a convolution matrix. Here is the sample code to apply a convolution matrix, and here is an overview of convolution matrices as well as some sample matrices (including blur and gaussian blur).
来源:https://stackoverflow.com/questions/1356250/iphone-blur-uiimage