【发布时间】:2016-07-07 00:25:30
【问题描述】:
我正在尝试寻找一种更快的方法来生成Gaussian Blur 图像,这个blog 可以很好地处理大部分图像。
但是当图像具有透明背景色时,模糊的图像看起来很糟糕
以下代码复制自博客:
-(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 方式慢。
请帮我修改上面的vImage代码, 我已经尝试了很多,并使用演示here发布代码;
:)
【问题讨论】:
-
最后,我通过简单的将图像转换为 .png 来移除 alpha 通道来解决它
UIImage *inputImage = [UIImage imageWithData:UIImageJPEGRepresentation(img, 1.0)]; -
透明图片,模糊结果在这里i.stack.imgur.com/o1iVy.png,对不起,我没有足够的声誉来发布图片
-
我希望结果是这样的,i.stack.imgur.com/RZJ6V.png
标签: ios blur gaussian core-image vimage