问题
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?
回答1:
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 :)
回答2:
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];
回答3:
Consider approaching the job via CIFilter:
Developing Core Image Filters for iOS
回答4:
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.
回答5:
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