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
с это было бы более эффективным.