2009-08-31 8 views
8

In meiner iPhone-Anwendung habe ich eine schwarz-weiß UIImage. Ich muss das Bild verwischen (Gaußsche Unschärfe würde es tun).iPhone: Blur UIImage

iPhone weiß eindeutig, wie man Bilder verwischt, wie it does that when it draws shadows.

Allerdings habe ich nichts in Bezug auf die API gefunden.

Muss ich die Unschärfe von Hand machen, ohne Hardwarebeschleunigung?

Antwort

0

Grundsätzlich gibt es keine direkte API, um den Unschärfeeffekt zu implementieren. Sie müssen die Pixel verarbeiten, um dies zu erreichen.

iPhone zeichnen Schatten mit Hilfe von Farbverlauf und nicht durch Unschärfe.

0

Um ein Bild zu verwischen, würden Sie eine Faltungsmatrix verwenden. Hier ist die sample code zum Anwenden einer Faltungsmatrix, und hier ist eine overview of convolution matrices sowie einige Sample-Matrizen (einschließlich Unschärfe und Gaußscher Unschärfe).

14

Versuchen Sie, diese (gefunden 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; 
} 

Und es wie folgt verwenden:

UIImage *blurredImage = [originalImage imageWithGaussianBlur]; 

Um stärker verwischen Sie einfach diesen Effekt anwenden zweimal oder mehr :)