【问题标题】:Processing JPEG images in background threads在后台线程中处理 JPEG 图像
【发布时间】:2013-12-03 04:30:13
【问题描述】:

我有两个后台线程同时运行。 第一个线程将原始像素数据转换为 UIImage(使用 CGImageCreate)并使用 UIImageJPEGRepresentation 将此图像保存为 JPEG。 第二个线程从文件中读取 JPEG 数据并将其加载到 UIImage 中。然后从这个 UIImage 中提取原始像素数据(使用 CGBitmapContextCreate)。

问题是线程写入的 JPEG 偶尔(50 个中有 1 个)数据损坏:

损坏的图像通常具有纯色的顶部/底部区域。

如果我使用互斥锁来防止整个后台方法同时运行,问题就会消失。我也尝试使用 libjpeg 代替 UIKit 方法,它也可以正常工作。

我很确定我的线程不会同时访问相同的图像数据。 据我所知,一些 UIKit 方法是线程安全的。但是在这种情况下看起来有些东西不是线程安全的。

我的问题是,在一个线程上将原始像素数据保存为 JPEG,同时在另一个线程上将 JPEG 解码为原始像素数据的正确方法是什么?我还需要同时在主线程上使用 UIImage 进行一些绘图。

【问题讨论】:

  • 为什么不将保存的数据合并为JPEG,然后将JPEG解码为数据,然后在主线程中显示图像?
  • 我的应用相当复杂。线程正在处理不同的数据,而不是相同的图像。并且主线程绘制的图像与线程处理的图像不同。

标签: ios multithreading uiimage uikit


【解决方案1】:

原来问题是我在创建 CGImage 后删除了传递给CGDataProviderCreateWithData 的像素数据。 只有调用回调CGDataProviderReleaseDataCallback后才能销毁数据。

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2014-09-25
    • 2011-04-23
    相关资源
    最近更新 更多