Android Bitmap多线程处理 - 不是线程安全的?

时间:2015-06-29 12:33:28

标签: java android multithreading image-processing thread-safety

我想在我的Android应用程序中处理位图 - 位图可能很大,所以我使用多线程来执行更快的操作。这是我的代码(Runnable孩子的一部分):

{{1}}

当我在池中只使用一个线程时,一切都会正常工作。不幸的是,当我使用的线程数等于处理器的核心数(我的设备中有4个)时,结果如下(对于灰度滤波器):

issue

有时看起来像是:

  • bitmap.getPixels(...)不起作用,因为输出中有黑线
  • bitmap.setPixels(...)不起作用,因为输出中的行没有变化

我是对的吗?这些函数是否是线程不安全的?我应该如何执行多线程位图过滤以实现快速且线程安全?

1 个答案:

答案 0 :(得分:4)

Android中的2D图像处理由Skia库提供,也可由Chrome使用。

很难找到明确的答案。 “Skia不是线程安全的,虽然SkBitmap [Bitmap使用] 线程安全的......”我不知道该怎么想。我仔细阅读了一堆难以理解的JNI / C ++代码,这是我能提供的最好的代码(这似乎比其他任何人都能做的更多):

我认为您应该在整个位图上调用bitmap.getPixels()。然后划分结果数组并线程化处理。完成所有线程后,重新组合结果并调用bitmap.setPixels()

似乎bitmap.getPixels()bitmap.setPixels()应该只是memcpy() s,但还有更多内容涉及引用计数,图像缓存,色彩空间转换,预乘和谁知道还有什么。将Bitmap方法排除在并发处理之外应该可以避免麻烦。