iPhone: Blur UIImage - PullRequest
       25

iPhone: Blur UIImage

9 голосов
/ 31 августа 2009

В моем приложении для iPhone у меня есть черно-белое UIImage. Мне нужно размыть это изображение (можно сделать размытие по Гауссу).

iPhone четко знает, как размыть изображения, так же как делает это, когда рисует тени

Однако я не нашел ничего связанного с API.

Нужно ли делать размытие вручную, без аппаратного ускорения?

Ответы [ 5 ]

15 голосов
/ 05 февраля 2012

Попробуйте это (найдено здесь ):

@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;
}

И используйте это так:

UIImage *blurredImage = [originalImage imageWithGaussianBlur];

Чтобы усилить размытие, просто примените этот эффект дважды или более:)

6 голосов
/ 07 февраля 2012

После появления той же проблемы в прошлом, проверьте эту библиотеку:

https://github.com/tomsoft1/StackBluriOS

Очень прост в использовании:

UIImage *newIma=[oldIma stackBlur:radius];
2 голосов
/ 26 марта 2015

Подумайте о приближении к работе через CIFilter:

Разработка базовых фильтров изображений для iOS

0 голосов
/ 23 ноября 2011

Чтобы размыть изображение, вы должны использовать матрицу свертки. Вот пример кода для применения матрицы свертки, а также обзор матриц свертки , а также некоторые образцы матриц (включая размытие и размытие по Гауссу).

0 голосов
/ 20 ноября 2010

В принципе, нет прямого API для реализации эффекта размытия. Вам нужно обработать пиксели для достижения этой цели.

iPhone рисует тени с помощью градиента, а не размытия.

...