GPUImage 动画高斯模糊滤镜

2024-06-23

我使用 GPUImage 高斯模糊滤镜来模糊静态图像。我想将模糊大小与 UI 元素联系起来,当用户更改该元素时,我会模糊图片。我现在的做法是,当发生重大(> 0.25)变化时,更改blurSize,重新应用滤镜并将新图像动画化到imageView中。

有没有更有效的方法让我这样做?

在 iPhone 5 上,虽然性能并不滞后,但也不是超级流畅(但也许这是因为此操作成本太高,无法实现超级流畅)。


有趣的问题。最好的选择是在您的范围内以几个模糊比例预先计算和渲染 CGImage,然后使用两个堆叠的 UIImageView,其中顶部的一个显示较模糊的副本但部分透明。例如,如果您在半径 1,2,3,…,10 处进行模糊渲染,并且想要显示 3.7,则可以在底部显示图像 3,在顶部显示图像 4,不透明度为 70%。

// Created in answer to Nikhil Varma's question at http://stackoverflow.com/questions/18804668/gpuimage-animated-gaussian-blur-filter
#import "GPUImage.h"
#define BLUR_STEP 2.
@interface AHViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIImageView *imageView2;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (nonatomic) CGFloat blurRadius;
@property (nonatomic, strong) UIImage *image;
@property (nonatomic, strong) GPUImageGaussianBlurFilter *blurFilter;
@property (nonatomic, strong) NSCache *blurredImageCache;
@property (nonatomic, strong) dispatch_queue_t blurQueue;
@property (nonatomic, strong) NSMutableSet *blurAmountsBeingRendered;
@end

@implementation AHViewController

-(void)viewDidLoad {
    [super viewDidLoad];
    self.image = [UIImage imageNamed:@"ph.jpg"];
    self.blurFilter = [GPUImageGaussianBlurFilter new];
    self.blurredImageCache = [NSCache new];
    self.blurQueue = dispatch_queue_create("Image Blur Queue", DISPATCH_QUEUE_SERIAL);
    self.blurAmountsBeingRendered = [NSMutableSet set];
    self.blurRadius = 1.0;
}
- (IBAction)sliderDidMove:(UISlider *)sender {
    self.blurRadius = 10 * sender.value;
}
-(void)setBlurRadius:(CGFloat)blurRadius {
    _blurRadius = blurRadius;
    CGFloat smaller = self.blurRadius - fmodf(self.blurRadius, BLUR_STEP);
    [self asyncGenerateImageWithBlurAmount:smaller];
    CGFloat larger = smaller + BLUR_STEP;
    [self asyncGenerateImageWithBlurAmount:larger];

}
-(UIImage *)cachedImageWithBlurAmount:(CGFloat)blur {
    return [self.blurredImageCache objectForKey:@(blur)];
}
-(void)asyncGenerateImageWithBlurAmount:(CGFloat)blur {
    // This image is already available.
    if([self.blurredImageCache objectForKey:@(blur)]) {
        [self imageIsAvailableWithBlur:blur];
        return;
    }
    // There's already a render going on for this. Just return.
    if([self.blurAmountsBeingRendered containsObject:@(blur)])
        return;

    // Start a render
    [self.blurAmountsBeingRendered addObject:@(blur)];
    dispatch_async(self.blurQueue, ^{
        self.blurFilter.blurSize = blur;
        UIImage *result = [self.blurFilter imageByFilteringImage:self.image];
        [self.blurredImageCache setObject:result forKey:@(blur)];
        [self.blurAmountsBeingRendered removeObject:@(blur)];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self imageIsAvailableWithBlur:blur];
        });
    });
}

-(void)imageIsAvailableWithBlur:(CGFloat)blurAmount {
    CGFloat smaller = self.blurRadius - fmodf(self.blurRadius, BLUR_STEP);
    CGFloat larger = smaller + BLUR_STEP;

    UIImage *sharperImage = [self cachedImageWithBlurAmount:smaller];
    UIImage *blurrier = [self cachedImageWithBlurAmount:larger];
    if(sharperImage && blurrier) {
        if(![self.imageView.image isEqual:sharperImage])
            self.imageView.image = sharperImage;
        if(![self.imageView2.image isEqual:blurrier]) {
            self.imageView2.image = blurrier;
        }
        self.imageView2.alpha = (self.blurRadius - smaller) / BLUR_STEP;
    }
}


@end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GPUImage 动画高斯模糊滤镜 的相关文章

随机推荐

  • Woocommerce 中的订单接收页面上的 JS 跟踪代码中的订单商品

    我正在尝试在 Woocommerce 谢谢页面中集成跟踪代码 我只找到了订单id来填写 但我不知道如何完成订单项目数据 这是我的实际代码
  • SQL Server 将 XML 子节点附加到父节点

    我需要一个脚本 可以将新的 xml 子节点插入 附加到预先存在的 xml 父节点 New child nodes DECLARE XMLChildData XML SET XMLChildData
  • 由容器管理的多个EntityManager(CMT)

    我遇到以下情况 我的应用程序需要动态连接到多个数据库 因此经过大量搜索后 我认为最好的选择是创建多个 EntityManager 并在运行时决定使用哪一个 这是代码 public class GenericDao PersistenceCo
  • ES6 箭头函数和函数内的词法作用域[重复]

    这个问题在这里已经有答案了 let a gt name Anna func gt console log this name let b gt name Brian func function console log this name l
  • UNIX/Linux IPC:从管道读取。运行时如何知道数据长度?

    我有一个子进程 它生成一些可变长度的输出 然后使用半双工管道将其发送到父进程 在父级中 如何使用 read 函数 由于每次数据的长度可能不同 我如何在运行时知道数据的大小以对缓冲区执行任何 malloc 操作 fstat 函数可以用于管道文
  • IE8 不透明度 activex 问题

    在我的 css 文件中我有这个 imageDes opacity 70 filter alpha opacity 70 如果我在 html 页面上使用它并在 IE8 中打开它 我会收到一个 activex 警告 我能做些什么 这是在本地安全
  • 在 IIS 服务下使用 COM 在 C# 中将 PowerPoint 渲染为 png 时出现问题

    首先 我的程序可以将 pptx 渲染为 png 但在 Windows Server 2008 R2 上渲染时质量大大降低 我想知道为什么 我使用 Cassini 在 Windows 7 x64 上测试了我的程序 并且将 pptx 渲染为 p
  • 关于ggplot2:旋转geom_point形状并在线上方显示geom_text

    早上好 我正在尝试使用 ggplot2 包进行绘图 但面临以下问题 为了使它更容易理解 这是我想要制作的目标图像 就像图像一样 我想要执行以下操作 1 在虚线上方放置一个文本 中位数 以便可以清楚地看到该字符 2 旋转三角形的度数 不是 而
  • MSTest 中数据驱动测试的问题

    我正在尝试使用 MSTest Selenium 在 C 中进行数据驱动测试 这是我尝试设置它的一些代码的示例 TestClass public class NewTest private ISelenium selenium private
  • 查找列表中元素的索引

    我需要获取方案列表中元素的索引 例如 2 2 3 4 5 4 2 3 4 5 2 有人可以帮忙吗 像这样的东西 define list index lambda e lst if null lst 1 if eq car lst e 0 i
  • 如何在 AS3 flash 中暂停/播放嵌入声音

    我有一个长度为 1 分 30 分钟的声音 我将其嵌入到我的 swf 中并将其设置为与框架同步 我需要的是能够通过 ActionScript 暂停和播放这个声音 有谁知道如何做到这一点 number that is redefined whe
  • 为什么 Single() 找到多个元素时不直接返回? [复制]

    这个问题在这里已经有答案了 我在 大致 找到了这段代码Enumerable Single http msdn microsoft com en us library system linq enumerable single aspx方法
  • 如何强制 LINQ to SQL 对可为空的外键执行 INNER JOIN?

    我有一个非常简单的设置 表 Node 具有可为空的外键 ObjectId 这在我的数据库模型中用一对多关联表示 现在 我想运行一个查询 为我提供具有特定对象 ID 的所有节点对象 在直接 SQL 中 这非常简单 SELECT Node Ob
  • CurrentAppSimulator.RequestProductPurchaseAsync 购买模拟

    我正在尝试为我的 Windows 应用商店应用程序 Metro 应用程序 实现应用程序内购买 我指的是代码示例here http msdn microsoft com en us library windows apps hh694067
  • 编码URIComponent抛出异常

    我正在以编程方式构建一个 URI 的帮助encodeURIComponent使用用户提供的输入的功能 但是 当用户输入无效的unicode字符时 例如U DFFF 该函数抛出异常并显示以下消息 要编码的 URI 包含无效字符 我查了一下MS
  • Protractor Internet Explorer 缓慢

    我一直在尝试让 Internet Explorer 11 在 Protractor 下运行 以完成我为新的 AngularJS 项目进行的一套测试 我在 Windows 7 64 位下运行 并已下载并安装了 64 位的 Selenium I
  • 如何将 Vue 测试库与 Nuxt.js 一起使用?

    我想用Vue 测试库 https www npmjs com package testing library vue in my Nuxt js应用程序 但安装包后立即启动测试会触发此错误 vue cli service 不被识别为内部或外
  • 如何冻结WPF中的数据网格列

    冻结前两列 但如果我想像第三列或第四列那样动态冻结该列 我该怎么做 您可以使用变量FrozenColumnCount这将设置网格中冻结的最左边的列数 但是 如果您只想冻结第三列 那么我认为您需要编写一个自定义控件 在数据网格中 只能冻结最左
  • 埃拉托色尼筛法的 Java 实现可以超过 n = 2^32?

    目前我有这个质数生成器 其限制为 n Sieve public class Main public static void main String args long N 2000000000 initially assume all in
  • GPUImage 动画高斯模糊滤镜

    我使用 GPUImage 高斯模糊滤镜来模糊静态图像 我想将模糊大小与 UI 元素联系起来 当用户更改该元素时 我会模糊图片 我现在的做法是 当发生重大 gt 0 25 变化时 更改blurSize 重新应用滤镜并将新图像动画化到image