9

我正在对 a 的内容进行快照NSView,应用 aCIFilter并将结果放回视图中。如果CIFilter是一种模糊形式,例如CIBoxBlurCIGuassianBlur,则过滤后的结果会比原始结果略小。当我迭代地这样做时,结果变得越来越小,我想避免这种情况。

这里提到了这个问题,尽管上下文略有不同(Quartz Composer)。AppleFunHouse演示应用程序应用 aGuassian blur而不缩小图像,但我还没有弄清楚这个应用程序是如何做到的(它似乎正在使用OpenGL我不熟悉的)。

这是代码的相关部分(在NSView子类中)

NSImage* background = [[NSImage alloc] initWithData:[self dataWithPDFInsideRect:[self bounds]]];

CIContext* context = [[NSGraphicsContext currentContext] CIContext];
CIImage* ciImage = [background ciImage];

 CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"
 keysAndValues: kCIInputImageKey, ciImage,
 @"inputRadius", [NSNumber numberWithFloat:10.0], nil];

CIImage *result = [filter valueForKey:kCIOutputImageKey];
CGImageRef cgImage = [context createCGImage:result
                                   fromRect:[result extent]];

NSImage* newBackground = [[NSImage alloc] initWithCGImage:cgImage size:background.size];

如果我尝试使用不会移动像素的变色滤镜,例如CISepiaTone,则不会发生收缩。

我想知道是否有不涉及潜入的快速修复openGL

4

3 回答 3

18

他们实际上并没有缩小图像,而是将其扩展(我认为所有边缘都增加了 7 个像素),默认的 UIView 'scale To View' 使它看起来像是缩小了。

裁剪你的 CIImage :

CIImage *cropped=[output imageByCroppingToRect:CGRectMake(0, 0, view.bounds.size.width*scale, view.bounds.size.height*scale)];

其中 view 是您绘制的 NSView 的原始边界,“scale”是您的 [UIScreen mainScreen] scale]。

于 2012-12-16T04:11:02.823 回答
16

您可能想在使用模糊之前钳制图像:

- (CIImage*)imageByClampingToExtent {
    CIFilter *clamp = [CIFilter filterWithName:@"CIAffineClamp"];
    [clamp setValue:[NSAffineTransform transform] forKey:@"inputTransform"];
    [clamp setValue:self forKey:@"inputImage"];
    return [clamp valueForKey:@"outputImage"];
}

然后模糊,然后裁剪到原始范围。这样你会得到不透明的边缘。

于 2014-03-29T19:56:59.023 回答
5

@BBC_Z 的解决方案是正确的。

尽管我发现不根据视图进行裁剪,而是根据图像进行裁剪更优雅。
你可以剪掉无用的模糊边缘:

// Crop transparent edges from blur
resultImage = [resultImage imageByCroppingToRect:(CGRect){
    .origin.x = blurRadius,
    .origin.y = blurRadius,
    .size.width = originalCIImage.extent.size.width - blurRadius*2,
    .size.height = originalCIImage.extent.size.height - blurRadius*2
}];
于 2014-03-29T09:39:12.770 回答