高斯模糊 毛玻璃效果

pragma mark -

pragma mark generateBlurImage

-(UIImage *)boxblurImageWithBlur:(CGFloat)blur andImage:(UIImage *)image

{

NSData *imageData = UIImageJPEGRepresentation(image, 1); // convert to jpeg

UIImage* destImage = [UIImage imageWithData:imageData];





if (blur < 0.f || blur > 1.f) {

    blur = 0.5f;

}

int boxSize = (int)(blur * 40);

boxSize = boxSize - (boxSize % 2) + 1;



CGImageRef img = destImage.CGImage;



vImage_Buffer inBuffer, outBuffer;



vImage_Error error;



void *pixelBuffer;





//create vImage_Buffer with data from CGImageRef



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);



//create vImage_Buffer for output



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);



// Create a third buffer for intermediate processing

void *pixelBuffer2 = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));

vImage_Buffer outBuffer2;

outBuffer2.data = pixelBuffer2;

outBuffer2.width = CGImageGetWidth(img);

outBuffer2.height = CGImageGetHeight(img);

outBuffer2.rowBytes = CGImageGetBytesPerRow(img);



//perform convolution

error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer2, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);

if (error) {

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

}

error = vImageBoxConvolve_ARGB8888(&outBuffer2, &inBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);

if (error) {

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

}

error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);

if (error) {

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

}



CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef ctx = CGBitmapContextCreate(outBuffer.data,

                                         outBuffer.width,

                                         outBuffer.height,

                                         8,

                                         outBuffer.rowBytes,

                                         colorSpace,

                                         (CGBitmapInfo)kCGImageAlphaNoneSkipLast);

CGImageRef imageRef = CGBitmapContextCreateImage (ctx);

UIImage *returnImage = [UIImage imageWithCGImage:imageRef];



//clean up

CGContextRelease(ctx);

CGColorSpaceRelease(colorSpace);



free(pixelBuffer);

free(pixelBuffer2);

CFRelease(inBitmapData);



CGImageRelease(imageRef);



return returnImage;

}

你可能感兴趣的:(高斯模糊 毛玻璃效果)