Cocoa touch iOS 5是否支持模糊核心图像过滤器?
根据文档,它应该支持模糊,请注意“在iOS 5.0及更高版本中提供”: 但根据该设备,它不会: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
[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重置来修复它。无论如何,上面约翰·斯蒂芬的替换是一个很好的解决方案。