Cocoa touch iOS 5是否支持模糊核心图像过滤器?

Cocoa touch iOS 5是否支持模糊核心图像过滤器?,cocoa-touch,ios5,core-image,Cocoa Touch,Ios5,Core Image,根据文档,它应该支持模糊,请注意“在iOS 5.0及更高版本中提供”: 但根据该设备,它不会: [CIFilter filterNamesInCategory:kCICategoryBlur]; 不返回任何内容 根据以下内容,我的iPhone和模拟器(均运行5.0)上只有这些过滤器可用: 不幸的是,它不支持任何模糊。为此,你必须自己动手。我也很失望地发现iOS中的核心图像不支持模糊。这是我写的一个函数,用于在UIImage上进行9点高斯模糊。反复呼叫以获得更强的模糊效果 @interface

根据文档,它应该支持模糊,请注意“在iOS 5.0及更高版本中提供”:

但根据该设备,它不会:

[CIFilter filterNamesInCategory:kCICategoryBlur];
不返回任何内容

根据以下内容,我的iPhone和模拟器(均运行5.0)上只有这些过滤器可用:


不幸的是,它不支持任何模糊。为此,你必须自己动手。

我也很失望地发现iOS中的核心图像不支持模糊。这是我写的一个函数,用于在UIImage上进行9点高斯模糊。反复呼叫以获得更强的模糊效果

@interface UIImage (ImageBlur)
- (UIImage *)imageWithGaussianBlur9;
@end

@implementation UIImage (ImageBlur)
- (UIImage *)imageWithGaussianBlur9 {
    float weight[5] = {0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162};
    // Blur horizontally
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[0]];
    for (int x = 1; x < 5; ++x) {
        [self drawInRect:CGRectMake(x, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[x]];
        [self drawInRect:CGRectMake(-x, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[x]];
    }
    UIImage *horizBlurredImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    // Blur vertically
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    [horizBlurredImage drawInRect:CGRectMake(0, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[0]];
    for (int y = 1; y < 5; ++y) {
        [horizBlurredImage drawInRect:CGRectMake(0, y, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[y]];
        [horizBlurredImage drawInRect:CGRectMake(0, -y, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[y]];
    }
    UIImage *blurredImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    //
    return blurredImage;
}
然后重复此操作以获得更强的模糊效果,如下所示:

UIImage *blurredImage = [originalImage imageWithGaussianBlur9];
blurredImage = [blurredImage imageWithGaussianBlur9];
UIImage *newIma=[sourceIma stackBlur:radius]

同样,为了保存所有iOS模糊ISS,以下是我的贡献:

基于堆栈模糊的简单模糊库。堆栈模糊与高斯模糊非常相似,但速度要快得多(请参阅)

像这样使用它:

UIImage *blurredImage = [originalImage imageWithGaussianBlur9];
blurredImage = [blurredImage imageWithGaussianBlur9];
UIImage *newIma=[sourceIma stackBlur:radius]

希望这些帮助

虽然iOS 5.0上的核心图像缺少模糊过滤器,但仍然有一种方法可以获得GPU加速的图像和视频模糊。我的开源框架有多种模糊类型,包括高斯模糊(使用GPUImageGaussianBlurFilter表示普通高斯模糊,或使用gpuimagefastfulfilter表示硬件优化的9击高斯模糊)、长方体模糊(使用GPUImageBoxBlurFilter)、中值模糊(使用GPUImageMedianFilter)和双边模糊(使用GPUImageBilateralBlurFilter)

我在中描述了用于实现硬件优化高斯模糊的着色器,您可以检查我在框架中其余部分使用的代码。这些过滤器的运行速度比我尝试过的任何CPU限制的例程快几十倍


我还将这些模糊合并到多阶段处理效果中,如反锐化遮罩、倾斜偏移过滤、Canny边缘检测和Harris角点检测,所有这些都可以作为此框架中的过滤器使用。

以下是我们关于使用不同方法在iOS应用程序中制作模糊效果的教程的链接

更新:从iOS 6开始
[CIFilter FilterNameIncategy:kCICategoryBlur]
返回
CIGaussianBlur
表示此过滤器在设备上可用。即使这是事实,您(可能)使用GPUImage将获得更好的性能和更大的灵活性。

如果您可以在iOS应用程序中使用OpenGL ES,这就是您选择的像素邻域半径中位数的计算方法(中位数当然是一种模糊):

kernelvec4内核(采样器u){
vec4像素=不加乘法(采样(u,采样坐标(u));
vec2 xy=destCoord();
int半径=3;
int边界=(半径-1)/2;
vec4总和=vec4(0.0);

对于(int i=(0-bounds);i因为我使用了Xamarin,所以我将John Stephen的答案转换为C#:

带有GaussianBlur9的私有UIImage图像(UIImage图像)
{
var重量=新nfloat[]
{
0.2270270F、0.1945945946f、0.1216216216f、0.0540540541f、0.01621622F
};
变量宽度=image.Size.width;
变量高度=image.Size.height;
//水平模糊
UIGraphics.BeginImageContextWithOptions(image.Size,false,1f);
image.Draw(新的CGRect(0f,0f,宽度,高度),CGBlendMode.plusliner,weight[0]);
对于(int x=1;x<5;++x)
{
image.Draw(新的CGRect(x,0,宽度,高度),CGBlendMode.plusliner,weight[x]);
image.Draw(新的CGRect(-x,0,宽度,高度),CGBlendMode.plusigner,weight[x]);
}
var horizbluredimage=UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
//垂直模糊
UIGraphics.BeginImageContextWithOptions(image.Size,false,1f);
HorizBluredImage.Draw(新的CGRect(0,0,宽度,高度),CGBlendMode.Plusigner,重量[0]);
对于(int y=1;y<5;++y)
{
水平模糊图像绘制(新的CGRect(0,y,宽度,高度),CGBlendMode.plusigner,重量[y]);
水平模糊图像绘制(新的CGRect(0,-y,宽度,高度),CGBlendMode.plusigner,重量[y]);
}
var blurredImage=UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
返回模糊图像;
}

我已经实现了我自己的应用程序,该应用程序已经在app store上发布,但我会记住这一点,以备将来参考。谢谢你的提示!StackBlur iOS将图像旋转90度。我认为应该是这样的fixed@ppaulojr你确定旋转问题吗?它应该保持所有其他参数相同。如果你仍然有问题,请se提供与测试代码IOS 6.0有问题的示例图像:-
m_PixelBuf[offset]=dv[rsum];
提供
EXC_BAD_访问
(code=2,addres=*******看起来这个库在奇数大小上有一些问题伟大的低依赖性解决方案Brad,你太惊讶了,这个库太棒了!很遗憾我不能多次投票支持它。文档上说,
kCICategoryBlur
常量是可用的,确实如此。你在
[CIFilter过滤器名称类别:kCICategoryBlur]
。这告诉你当时没有可用的模糊过滤器。@idz让我笑了,谢谢!我发现CIFilter blur非常不稳定。偶尔,它会在我的iPad上造成一个非常奇怪的崩溃,锁定屏幕,但我可以告诉你iPad仍然可以使用,因为我可以听到它对触摸做出反应时的声音。我必须ard重置来修复它。无论如何,上面约翰·斯蒂芬的替换是一个很好的解决方案。