gpt4 book ai didi

ios - 当应用程序处于后台时,CIFilter 无法正常工作

转载 作者:行者123 更新时间:2023-11-28 22:28:09 24 4
gpt4 key购买 nike

我们正在对几张图片应用“CIGaussianBlur”滤镜。该过程大部分时间都运行良好。但是,当应用程序移至后台时,该过程会在图像上产生白色条纹。 (下面的图片,请注意图片的左侧和底部有白色条纹,并且与原始图片相比,图片有点尖锐)。

代码:

 - (UIImage*)imageWithBlurRadius:(CGFloat)radius
{
UIImage *image = self;
LOG(@"(1) image size before resize = %@",NSStringFromCGSize(image.size));
NSData *imageData = UIImageJPEGRepresentation(self, 1.0);
LOG(@"(2) image data length = %ul",imageData.length);

//create our blurred image
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];

//setting up Gaussian Blur (we could use one of many filters offered by Core Image)
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setValue:inputImage forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:radius] forKey:@"inputRadius"];
CIImage *result = [filter valueForKey:kCIOutputImageKey];
//CIGaussianBlur has a tendency to shrink the image a little, this ensures it matches up exactly to the bounds of our original image
CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];
UIImage *finalImage = [UIImage imageWithCGImage:cgImage];

CGImageRelease(cgImage);
LOG(@"(3) final image size after resize = %@",NSStringFromCGSize(finalImage.size));
return finalImage;
}

过滤前 enter image description here )

过滤后 enter image description here

最佳答案

实际上,我刚刚遇到了这个确切的问题,并找到了一个与@RizwanSattar 描述的不同的解决方案。

根据与 Apple 开发板上的“Rincewind”的交流,我所做的是首先在图像上应用 CIAffineClamp,并将变换值设置为标识。这将创建一个相同比例的图像,但范围是无限的。这会导致模糊正确地模糊边缘。

然后在我应用模糊之后,我将图像裁剪到它的原始范围,裁剪掉边缘出现的羽化。

您可以在我发布在 github 上的 CI Filter 演示应用程序中查看代码:

CIFilter demo project on github

这是一个处理所有不同 CI 过滤器的通用程序,但它有处理高斯模糊过滤器的代码。

看看方法showImage。它有特殊情况的代码,可以在应用模糊滤镜之前设置源图像的范围:

if ([currentFilterName isEqualToString: @"CIGaussianBlur"])
{
// NSLog(@"new image is bigger");
CIFilter *clampFilter = [self clampFilter];

CIImage *sourceCIImage = [CIImage imageWithCGImage: imageToEdit.CGImage];
[clampFilter setValue: sourceCIImage
forKey: kCIInputImageKey];


[clampFilter setValue:[NSValue valueWithBytes: &CGAffineTransformIdentity
objCType:@encode(CGAffineTransform)]
forKey:@"inputTransform"];



sourceCIImage = [clampFilter valueForKey: kCIOutputImageKey];
[currentFilter setValue: sourceCIImage
forKey: kCIInputImageKey];
}

(方法“clampFilter”只是延迟加载一个 CIAffineClamp 过滤器。)

然后我应用用户选择的过滤器:

outputImage = [currentFilter valueForKey: kCIOutputImageKey];

然后在应用选定的滤镜后,我会检查生成的图像的范围,如果它更大,则将其裁剪回原始范围:

CGSize newSize;

newSize = outputImage.extent.size;

if (newSize.width > sourceImageExtent.width || newSize.height > sourceImageExtent.height)
{
// NSLog(@"new image is bigger");
CIFilter *cropFilter = [self cropFilter]; //Lazily load a CIAffineClamp filter

CGRect boundsRect = CGRectMake(0, 0, sourceImageExtent.width, sourceImageExtent.height);

[cropFilter setValue:outputImage forKey: @"inputImage"];

CIVector *rectVector = [CIVector vectorWithCGRect: boundsRect];

[cropFilter setValue: rectVector
forKey: @"inputRectangle"];
outputImage = [cropFilter valueForKey: kCIOutputImageKey];
}

关于ios - 当应用程序处于后台时,CIFilter 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18315684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com