在后台线程中处理JPEG图像

时间:2013-12-03 04:30:14

标签: ios multithreading uiimage uikit

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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