3

我正在使用 CIBloom 来模糊 a 中的一些文本CGImage,但正在发生的是 CIBloom 过滤器似乎使我的图像变得非常小

当过滤器内核变大时效果更差。我有点预料到这一点,但我需要一种方法来关闭它,或者一个公式来调整图像的大小,以便每个字母的大小与它最初的大小完全相同。我故意在源图像上留出边距。

CIBloom过滤器之前:

一个

CIBloom过滤器后:

在此处输入图像描述

模糊过滤器的代码:

CGImageRef cgImageRef = CGBitmapContextCreateImage( tex->cgContext ) ;

CIImage *cii = [CIImage imageWithCGImage:cgImageRef] ;

CIFilter *filter = [CIFilter filterWithName:@"CIBloom"] ; //CIGaussianBlur

[filter setValue:cii forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:1.1f] forKey:@"inputIntensity"];

// Large radius makes result EVEN SMALLER:
//[filter setValue:[NSNumber numberWithFloat:100.f] forKey:@"inputRadius"];

CIContext *ciContext = [CIContext contextWithOptions:nil];

CIImage *ciResult = [filter valueForKey:kCIOutputImageKey];
CGImageRef cgIRes = [ciContext createCGImage:ciResult fromRect:[ciResult extent]];

//Clear old tex
tex->clearBacking( 0, 0, 0, 1 ) ;

// Drop CIImage result into texture raw data
CGContextDrawImage( tex->cgContext, CGRectMake(0, 0, tex->w, tex->h), cgIRes ) ;

我喜欢CIBloom过滤器,但我需要结果与我的原始图像大小相同,而不是下采样。

4

2 回答 2

2

好吧,为默认内核大小 10 添加到图像的额外空间是 21x28。

在此处输入图像描述

对于 K=10,生成的图像每边添加 21 px,顶部和底部添加 28 px。请记住,背景是 768x1024 像素,看起来放大后会生成 810x1080 的图像。

玩弄这个,我想出了以下

CGContextDrawImage( tex->cgContext, CGRectMake(-30, -36, tex->w+2*30, tex->h+2*36), cgIRes ) ;

这看起来非常近似(必须有一个公式)并引入了一些失真,但它可以使图像几乎与原来的大小相同,而不会引入边界。

在此处输入图像描述

于 2013-03-31T18:17:22.180 回答
0

绽放效果会改变原始图像的位置和大小。所以你需要重新编辑它们。
在您的情况下,您更改以下代码行:

CGImageRef cgIRes = [ciContext createCGImage:ciResult fromRect:[ciResult extent]];

进入

CGImageRef cgIRes = [ciContext createCGImage:ciResult fromRect:[cii extent]];

希望对你有帮助

于 2019-02-15T06:15:18.913 回答