+(UIImage*)boxblurImage:(UIImage*)image withBlurNumber:(CGFloat)blur
{
if(blur <0.f|| blur >1.f) {
blur =0.5f;
}
intboxSize = (int)(blur *40);
boxSize = boxSize - (boxSize %2) +1;
CGImageRefimg = image.CGImage;
vImage_BufferinBuffer, outBuffer;
vImage_Errorerror;
void*pixelBuffer;
//从CGImage中获取数据
CGDataProviderRefinProvider =CGImageGetDataProvider(img);
CFDataRefinBitmapData =CGDataProviderCopyData(inProvider);
//设置从CGImage获取对象的属性
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);
error =vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer,NULL,0,0, boxSize, boxSize,NULL,kvImageEdgeExtend);
if(error) {
NSLog(@"error from convolution %ld", error);
}
CGColorSpaceRefcolorSpace =CGColorSpaceCreateDeviceRGB();
CGContextRefctx =CGBitmapContextCreate( outBuffer.data, outBuffer.width, outBuffer.height,8, outBuffer.rowBytes, colorSpace,kCGImageAlphaNoneSkipLast);
CGImageRefimageRef =CGBitmapContextCreateImage(ctx);
UIImage*returnImage = [UIImageimageWithCGImage:imageRef];
//clean up CGContextRelease(ctx);
CGColorSpaceRelease(colorSpace);
free(pixelBuffer);
CFRelease(inBitmapData);
CGColorSpaceRelease(colorSpace);
CGImageRelease(imageRef);
returnreturnImage;
}
网友评论