更改滑块时模糊 UIImage

2024-01-03

我尝试过高斯模糊并检查了 stackoverflow 上的所有问题,但没有一个解决了我的崩溃问题。请帮忙,除了高斯模糊算法之外,还有其他方法可以模糊图像吗?我的图像大小是 768x1024,循环迭代 2*1024*768 次,这是不可行的。

CGContextRef NYXImageCreateARGBBitmapContext(const size_t width, const size_t height, const size_t bytesPerRow)
{
/// Use the generic RGB color space
/// We avoid the NULL check because CGColorSpaceRelease() NULL check the value anyway, and worst case scenario = fail to create context
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

/// Create the bitmap context, we want pre-multiplied ARGB, 8-bits per component
CGContextRef bmContext = CGBitmapContextCreate(NULL, width, height, 8/*Bits per component*/, bytesPerRow, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst);

CGColorSpaceRelease(colorSpace);

return bmContext;
}



 -(UIImage*)blurredImageUsingGaussFactor:(NSUInteger)gaussFactor andPixelRadius:(NSUInteger)pixelRadius
{
CGImageRef cgImage = self.CGImage;
const size_t originalWidth = CGImageGetWidth(cgImage);
const size_t originalHeight = CGImageGetHeight(cgImage);
const size_t bytesPerRow = originalWidth * 4;
CGContextRef context = NYXImageCreateARGBBitmapContext(originalWidth, originalHeight, bytesPerRow);
if (!context) 
    return nil;

unsigned char *srcData, *destData, *finalData;

size_t width = CGBitmapContextGetWidth(context);
size_t height = CGBitmapContextGetHeight(context);
size_t bpr = CGBitmapContextGetBytesPerRow(context);
size_t bpp = CGBitmapContextGetBitsPerPixel(context) / 8;
CGRect rect = {{0.0f, 0.0f}, {width, height}}; 

CGContextDrawImage(context, rect, cgImage); 

// Now we can get a pointer to the image data associated with the bitmap
// context.
srcData = (unsigned char*)CGBitmapContextGetData(context);
if (srcData != NULL)
{
    size_t dataSize = bpr * height;
    finalData = malloc(dataSize);
    destData = malloc(dataSize);
    memcpy(finalData, srcData, dataSize);
    memcpy(destData, srcData, dataSize);

    int sums[gaussFactor];
    size_t i, /*x, y,*/ k;
    int gauss_sum = 0;
    size_t radius = pixelRadius * 2 + 1;
    int *gauss_fact = malloc(radius * sizeof(int));

    for (i = 0; i < pixelRadius; i++)
    {
        gauss_fact[i] = 1 + (gaussFactor * i);
        gauss_fact[radius - (i + 1)] = 1 + (gaussFactor * i);
        gauss_sum += (gauss_fact[i] + gauss_fact[radius - (i + 1)]);
    }
    gauss_fact[(radius - 1) / 2] = 1 + (gaussFactor*pixelRadius);
    gauss_sum += gauss_fact[(radius - 1) / 2];

    unsigned char *p1, *p2, *p3;

    for (size_t y = 0; y < height; y++) 
    {
        for (size_t x = 0; x < width; x++) 
        {
            p1 = srcData + bpp * (y * width + x); 
            p2 = destData + bpp * (y * width + x);

            for (i = 0; i < gaussFactor; i++)
                sums[i] = 0;

            for (k = 0; k < radius ; k++)
            {
                if ((y - ((radius - 1) >> 1) + k) < height)
                    p1 = srcData + bpp * ((y - ((radius - 1) >> 1) + k) * width + x); 
                else
                    p1 = srcData + bpp * (y * width + x);

                for (i = 0; i < bpp; i++)
                    sums[i] += p1[i] * gauss_fact[k];

            }
            for (i = 0; i < bpp; i++)
                p2[i] = sums[i] / gauss_sum;
        }
    }
    for (size_t y = 0; y < height; y++) 
    {
        for (size_t x = 0; x < width; x++) 
        {
            p2 = destData + bpp * (y * width + x);
            p3 = finalData + bpp * (y * width + x);

            for (i = 0; i < gaussFactor; i++)
                sums[i] = 0;

            for(k = 0; k < radius ; k++)
            {
                if ((x - ((radius - 1) >> 1) + k) < width)
                    p1 = srcData + bpp * ( y * width + (x - ((radius - 1) >> 1) + k)); 
                else
                    p1 = srcData + bpp * (y * width + x);

                for (i = 0; i < bpp; i++)
                    sums[i] += p2[i] * gauss_fact[k];

            }
            for (i = 0; i < bpp; i++)
            {
                p3[i] = sums[i] / gauss_sum;
            }
        }
    }
}

size_t bitmapByteCount = bpr * height;

///////Here was the problem.. you had given srcData instead of destData.. Rest all 
//were perfect...
CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, destData, bitmapByteCount, NULL);

CGImageRef blurredImageRef = CGImageCreate(width, height, CGBitmapContextGetBitsPerComponent(context), CGBitmapContextGetBitsPerPixel(context), CGBitmapContextGetBytesPerRow(context), CGBitmapContextGetColorSpace(context), CGBitmapContextGetBitmapInfo(context), dataProvider, NULL, true, kCGRenderingIntentDefault);

CGDataProviderRelease(dataProvider);
CGContextRelease(context); 
if (destData)
    free(destData);
if (finalData)
    free(finalData);

UIImage* retUIImage = [UIImage imageWithCGImage:blurredImageRef];

CGImageRelease(blurredImageRef);

return retUIImage;
}

我为 UIImage 做了一个小型的 StackBlur 扩展。 StackBlur 接近 GaussianBlur 但速度更快。

检查它:https://github.com/tomsoft1/StackBluriOS https://github.com/tomsoft1/StackBluriOS


小便条...自述文件中有一个拼写错误,“标准化”为“标准化”

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

更改滑块时模糊 UIImage 的相关文章

  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项
  • 如何在 iOS 中注册自定义文件类型

    我目前正在创建一个应用程序 我想让用户在其中备份他们的文件 plist m4a 我压缩文件并将扩展名更改为自定义扩展名 专门针对我的应用程序 例如 MyBackup 然后 用户可以通过电子邮件或 iTunes 文件共享进行导出 我已经阅读过
  • 如何在 Swift 3 中解析 JSON 数组 [重复]

    这个问题在这里已经有答案了 我从 Socket 获取了一些我想访问的数据 但收到错误消息 指出每次都无法将 NSArray 转换为 NSDictionary struct SocketEventHandler let event Strin
  • 这个错误是无效上下文0x0吗?

    我在ViewDidLoad中编写了以下代码 Implement viewDidLoad to do additional setup after loading the view typically from a nib void view
  • Swift 3 错误:[_SwiftValue pointSize] 无法识别的选择器发送到实例

    我刚刚将我们的项目迁移到 swift 3 发现由于一个问题导致大量崩溃 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 SwiftValue pointSize 发送到实例的无法识别的选择器 该
  • Transit MKDirectionsRequest 产生 null 错误 Error Domain=MKErrorDomain Code=5 "(null)"

    我正在尝试使用 MapKit Directions Request 来获取两个坐标之间的交通方向 当我切换到其他 非 Transit 类型时 下面的代码可以工作 但是当我切换到 Transit 时 它会抛出一个错误 该错误在 Apple 文
  • 如何检测Retina高清显示屏?

    UIScreen有一个新的 nativeScaleiOS 8 中的属性 但文档没有提及它 property nonatomic readonly CGFloat nativeScale 还有一个scale属性 但文档说它是 2 用于视网膜显
  • 适用于 Objective-C / iPhone 的良好 HTTP 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 UPDATE 这个问题显然已经过时了 参见日期 我建议只使用现代 iOS7 功能 例如 NSURLSession 我想 这个问题是为了历史
  • PresentModalViewController 不执行任何操作

    我有一个 UIViewController parent 调用presentModalViewController与另一个 UIViewController child on viewDidLoad If parent没有 UINaviga
  • iOS UIButton 带有圆角和背景 bug

    我发现圆形 UIButton 存在一个奇怪的问题 这是我创建此按钮的代码块 let roundedButton UIButton type System roundedButton frame CGRectMake 100 100 100
  • 您将如何实现一个检测水平滑动以允许分页的 UITableView?

    我想实现一个 UITableView 一次显示 20 行 但考虑到我实际上可能要展示 120 个项目 我想使用某种分页来处理这个问题 使用前 20 项填充表 当用户从右向左滑动时 用接下来的 20 个项目重新加载 UITableView 从
  • 无法使用 Xamarin 和 WCF 访问 Web 服务

    我想使用 Xamarin 和 WCF 来使用公共 Web 服务 对于这个演示 我将使用Xamarin iOS 这是我试图使用的 公共 网络服务 http www webservicex net globalweather asmx WSDL
  • 如何使用 Swift 获取 YouTube 频道的所有播放列表?

    我的问题不是关于从一般频道检索视频 我只想获取该频道创建的所有 播放列表 并检索每个播放列表的缩略图 标题和视频数量 这是一个 YouTube 频道示例 正如您所看到的 有很多已创建的播放列表 截至目前 我只能获取某个频道最新上传的视频 在
  • 线程 1:信号 SIGABRT - AppDelegate.h

    main m Journey Created by Julian Buscema on 2014 07 13 Copyright c 2014 Julian Buscema All rights reserved import
  • Xcode 9 中的“addingPercentEncoding”是否损坏?

    在 Swift 3 x 和 Xcode 9 beta 2 中 使用addingPercentEncoding https developer apple com documentation swift string 1690785 addi
  • 自定义 MKAnnotationView - 如何捕获触摸而不忽略标注?

    我有一个自定义 MKAnnotationView 子类 它完全按照我想要的方式显示视图 在那个视图中 我有一个按钮 我想捕获按钮上的事件来执行操作 这很好用 但是 我不希望标注被忽略或消失 基本上 触摸标注中的按钮将开始播放声音 但我想保留
  • 按下表格视图单元格时更改视图?

    我需要帮助 当我的 tableView 的单元格被选择时 我希望该单元格转到它自己的页面 我不希望每个单元格都转到同一页面 我尝试使用 FirstFolderViewController first FirstFolderViewContr
  • 我应该在哪个方法中设置 UITextField 的委托?

    在 viewDidLoad 或 init 方法中设置 UITextField 的委托是一个好习惯吗 我尝试在 init 方法中将委托设置为 self 但它没有调用相应的委托方法 当我将代码移动到 viewDidLoad 中时 它注册为将 s
  • 退出导航控制器

    我试图离开初始视图控制器 并进入空白视图控制器 这很好 但是这会使空白视图控制器也成为导航控制器的一部分 这不是我想要的 我想脱离视图控制器 在视图控制器中 我尝试退出 它会自行弹出 当我尝试视图中的方法时 将出现目标视图控制器 self

随机推荐

  • 模型将集合属性与部分视图绑定

    假设我有一个这样的模型 public class Foo public List
  • Android 方向改变动画

    当我将屏幕方向从纵向更改为横向时 我必须给出动画效果 反之亦然 我该怎么做呢 任何帮助 将不胜感激 谢谢 在 Activity 的 onCreate 方法中使用 overridePendingTransition int EnterAnim
  • 尝试在 NotepadV1 示例练习中加载资源时出现“找不到资源”异常

    我是 Android 新手 但不是 Java 我遵循示例练习 NotepadV1 但在虚拟设备上执行时出现奇怪的错误 Hello World 在同一虚拟设备上运行良好 运行程序时出现 找不到资源 异常 使用的 ID 是正确的 Eclipse
  • 如何在android中将所有联系人信息导出为VCF文件

    使用此代码我可以导出我设置的任何值 但除此之外我想保存图像 生日 关系 assistnat 注释 标签 网站 如何设置这个值来生成vcf文件 Person p getPerson File vcfFile new File this get
  • 打破数组循环函数(map、forEach 等)的循环

    我怎样才能打破 类似于break语句 来自数组的隐式循环 The Array prototype map Array prototype forEach等函数意味着对数组元素的循环 我想尽早有条件地打破这个循环 这个人为的例子 const
  • 具有两个优先级值的优先级队列

    众所周知 插入优先级队列的元素具有确定其优先级的值 例如 如果我有五个元素A B C D E具有优先级 我们称之为优先级值priorityI A 10 B 5 C 1 D 3 E 2 但是我如何编写一个可以定义两个优先级值的优先级队列 我的
  • 当类存在时ClassNotFoundException?

    我对此有点困惑 Android 正在抛出一个ClassNotFoundException即使有这样的班级 04 20 09 07 50 179 E AndroidRuntime 525 FATAL EXCEPTION main 04 20
  • PHP 浮点模数不起作用

    我编写了一个函数 以便在必要时向数字添加逗号和零 但我陷入了模数函数的困境 根据我的PHP float 877 5 1 0 true 不应该877 5 1 0 5 它提醒你你需要的是什么fmod http www php net manua
  • 如何使用 NLTK 从归纳语法生成句子?

    我有一个 大 解析句子列表 使用斯坦福解析器解析 例如 句子 现在你可以娱乐了 有以下树 ROOT S ADVP RB Now NP PRP you VP MD can VP VB be VP VBN entertained 我正在使用一组
  • AngularJS 可重用模态引导指令

    我是 AngularJS 的新手 我正在尝试实现一个可重用的模式引导程序 这是index html div div
  • 批量/多个 iOS 推送通知代码 - 适用于 2 台设备,但不适用于 100 台设备

    如果我发送到的设备数量为 2 即它们都收到推送通知 则以下代码可以正常工作 但如果我将该限制提高到 100 则不会收到推送通知 我已阅读此内容 看起来我正在正确发送批处理通知 即通过单个连接发送多个请求 连接超时设置得很好且很高 60 秒
  • 为什么我收到“Map”未从“react-leaflet”导出?

    为什么我得到 src components mapComponent MapView jsx Attempted import error Map is not exported from react leaflet 我将其导入到组件中 i
  • 如何检查 Thymeleaf 片段是否已定义

    使用时如何检查 Thymeleaf 片段是否已定义 模板装饰代替包含 技术 https stackoverflow com questions 18896915 thymeleaf templates is there a way to d
  • 可逆哈希函数?

    我需要一个可逆哈希函数 显然输入的大小比输出小得多 以随机的方式将输入映射到输出 基本上 我想要一种将 123 这样的数字转换为 9874362483910978 这样的更大数字的方法 但不是以保留比较的方式 因此如果 x1 gt x2 f
  • Request.Form 抛出异常

    我正在制作 ASP NET Core Web 应用程序 并且我正在通过 HttpContext 从 javascript 文件上传 PDF 文件 因此 当我尝试使用 Request Form File 在服务器端加载文件时 Form 会抛出
  • 地图,测试当前位置是否在折线上或附近

    我正在使用 google Direction api 绘制路线的折线 有谁有检查当前位置是否位于折线上 附近的示例吗 尝试确定用户当前位置是否在该线的 x 米范围内 如果不是 我将提出新请求并重新绘制新路线 Cheers 这是我的解决方案
  • 错误:413 请求太大 - 具有可恢复 MediaIoBaseUpload 请求的 Python Google Drive API

    这似乎遵循其他示例中发现的记录模式在文档中 https developers google com api client library python guide media upload resumable media chunked u
  • iPhone SDK:TableView 中的自定义按钮

    我在表视图中使用自定义按钮 它对我很有用 UITableViewCell tableView UITableView tableView cellForRowAtIndexPath NSIndexPath indexPath UIImage
  • 防止切换组未选择切换 - Java FX

    我有一个带有两个切换按钮的切换组 应如下所示 黄色切换是选定的切换 但是 当我单击选定的切换时 两个切换都会变为未选中状态 如下所示 然后 如果我尝试获取是否选择了切换开关 我会得到一个nullPointerException Boolea
  • 更改滑块时模糊 UIImage

    我尝试过高斯模糊并检查了 stackoverflow 上的所有问题 但没有一个解决了我的崩溃问题 请帮忙 除了高斯模糊算法之外 还有其他方法可以模糊图像吗 我的图像大小是 768x1024 循环迭代 2 1024 768 次 这是不可行的