UIImage Gaussian Blur с изображением

Я пытаюсь найти более быстрый способ создания Gaussian Blur изображение, этот блог прекрасно работает с большей частью изображения.

Но когда изображение имеет прозрачный фоновый цвет, размытое изображение выглядит плохо

Код ниже скопирован из блога:

-(UIImage *)vImageBlurWithNumber:(CGFloat)blur
{
    if (blur < 0.f || blur > 1.f) {
        blur = 0.5f;
    }
    int boxSize = (int)(blur * 100);
    boxSize = boxSize - (boxSize % 2) + 1;

    CGImageRef img = self.CGImage;

    vImage_Buffer inBuffer, outBuffer;
    vImage_Error error;

    void *pixelBuffer;

    CGDataProviderRef inProvider = CGImageGetDataProvider(img);
    CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);

    inBuffer.width = CGImageGetWidth(img);
    inBuffer.height = CGImageGetHeight(img);
    inBuffer.rowBytes = CGImageGetBytesPerRow(img);

    inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);

    pixelBuffer = malloc(CGImageGetBytesPerRow(img) *
                     CGImageGetHeight(img));

    if(pixelBuffer == NULL)
        NSLog(@"No pixelbuffer");

    outBuffer.data = pixelBuffer;
    outBuffer.width = CGImageGetWidth(img);
    outBuffer.height = CGImageGetHeight(img);
    outBuffer.rowBytes = CGImageGetBytesPerRow(img);

    // may be i should modify last 2 parameter below ,how ?
    error = vImageBoxConvolve_ARGB8888(&inBuffer,
                                   &outBuffer,
                                   NULL,
                                   0,
                                   0,
                                   boxSize,
                                   boxSize,
                                   NULL,
                                   kvImageEdgeExtend); //        kvImageBackgroundColorFill ?



    if (error) {
        NSLog(@"error from convolution %ld", error);
    }

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(
                                         outBuffer.data,
                                         outBuffer.width,
                                         outBuffer.height,
                                         8,
                                         outBuffer.rowBytes,
                                         colorSpace,
                                         kCGImageAlphaNoneSkipLast);
    CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
    UIImage *returnImage = [UIImage imageWithCGImage:imageRef];

    //clean up
//    CGContextRelease(ctx);
    CGColorSpaceRelease(colorSpace);

    free(pixelBuffer);
    CFRelease(inBitmapData);

    CGColorSpaceRelease(colorSpace);
    CGImageRelease(imageRef);

    return returnImage;
}

Я попробовал другой способ сделать Gaussian Blur Эффект,
используя Apple WWDC 2013 UIImage-ImageEffects категория,
но эффект этой категории больше похож Frosted glass вместо Gaussian Blur,

Blur in Core Image работает нормально, но это так медленно, как способ vImage.

GPUImage также медленнее, чем образ.

Пожалуйста, помогите мне изменить код vImage выше, я много пробовал, и выложите код с демо здесь;

:)

2 ответа

Было бы полезно посмотреть, что в этом плохого.

Если это просто области вблизи прозрачных областей, вы можете сначала попытаться предварительно умножить изображение. Это предотвратит утечку бессмысленных цветов в полностью прозрачных областях в остальную часть изображения.

Вы также можете сделать что-то вроде:

var noAlpha = CIVector(x: 0, y: 0, z: 0, w: 1)

image.imageByApplyingFilter("CIColorMatrix", 
    withInputParameters: ["inputAVector": noAlpha])

избавиться от альфы. Если вам нужно связать с другими CIFilterс это было бы более эффективным.

Другие вопросы по тегам