2016-07-03 14 views
0

Gaussian Blur 이미지를 생성하는 더 빠른 방법을 찾고 있는데,이 blog은 대부분의 이미지에서 잘 작동합니다.vImage를 사용하는 UIImage 가우시안 블러

그러나 이미지가 투명 backgroudcolor이있는 경우는 Blured 등 이미지

아래의 블로그에서 복사 된 코드에 좋지 : 나는 다른 방법을 시도

-(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 카테고리를 사용하면
이지만이 카테고리의 효과는 Gaussian Blur 대신 Frosted glass입니다.

Blur in Core Image 잘 작동하지만 vImage 방식보다 느립니다.

GPUImage 또한 vimage보다 느립니다.

위의 vImage 코드를 수정하는 데 도움을주십시오. 많은 노력을했지만 데모 코드를 게시하십시오 here;

:

+0

마지막으로 알파 채널을 제거하기 위해 .png로 변환합니다. UIImage * inputImage = [UIImage imageWithData : UIImageJPEGRepresentation (img, 1.0)]; ' –

+0

흐림 효과가있는 투명 이미지는 여기 http : // i. stack.imgur.com/o1iVy.png, 실례합니다. 이미지 게시에 충분한 평판이 없습니다. –

+0

결과가 다음과 같을 것으로 기대합니다. http://i.stack.imgur.com/RZJ6V.png –

답변

0

그것에 대해 나쁜 보이는 것을 볼 수 유용 할 것이다.

투명 영역 근처의 영역 인 경우 먼저 이미지를 미리 배정하십시오. 이렇게하면 완전히 투명한 영역의 의미없는 색상이 이미지의 나머지 부분으로 유출되는 것을 막을 수 있습니다.

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

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

은 알파 제거하기 :

+0

내 질문에 대한 이미지, 나는'UIGraphicsBeginImageContextWithOptions'를 사용하여 흰색 영역 색상을 가진 새로운 이미지를 만들지 만 여전히 투명하지 않은 영역을 제거하려고했습니다. 그런 다음'[UIImage imageWithData : UIImageJPEGRepresentation (img, 1.0)];을 사용하여 이미지를'png' 형식에서'jpeg' 형식으로 전송하여 알파 채널을 제거하려고 시도했지만 효과적이지는 않습니다. 회신을 기다리십시오 ~ –

+0

이미지를 불투명하게하는 일련의 vImageFlatten ... 기능이 있습니다. 그러나 실제로 알파 채널로 이미지를 미리 곱해보고 문제가 해결되는지 확인해야한다고 생각합니다. 덜 알파 정보는 그런 식으로 파괴됩니다. vImagePremultiplyData를 참조하십시오 ... –

0

또한 뭔가를 할 수 있습니다. 다른 CIFilter과 연결해야하는 경우이 방법이 더 효율적입니다.

+0

답장을 보내 주셔서 감사합니다. 이미지로 제 질문을 업데이트합니다. 당신의 대답을 시도했지만 작동하지 않습니다, 나는'[UIImage imageWithData : UIImageJPEGRepresentation (img, 1.0)];을 사용하여 이미지를 불투명하게 만든다. ~ ~ –