我希望在我的Android应用程序中处理位图 - 由于位图可能非常大,因此我使用多线程执行更快的操作。这是我的代码(Runnable子类的一部分):
@Override
public void run() {
int imageHeight = filter.getBitmap().getHeight();
int start = threadNumber * imageHeight / threadCount;
int stop = (threadNumber + 1) * imageHeight / threadCount;
for (int j = start; j < stop; j++) {
filter.processLine(j);
}
}
//...
protected void processLine(int lineNumber)
{
int width = bitmap.getWidth();
int pixels[] = new int[width];
bitmap.getPixels(pixels, 0, width, 0, lineNumber, width, 1);
for (int i = 0; i < width; i++) {
pixels[i] = processPixel(pixels[i]);
}
bitmap.setPixels(pixels, 0, width, 0, lineNumber, width, 1);
}
当我在线程池中只使用1个线程时,一切正常。不幸的是,当我使用与处理器核心数相等的线程数(我的设备上为4)时,结果如下所示(对于灰度滤镜):
![issue](https://istack.dev59.com/JJY4Z.webp)
- bitmap.getPixels(...)不起作用,因为输出中有黑线 - bitmap.setPixels(...)不起作用,因为输出中有未更改的行
我是对的吗?这些函数是线程不安全的吗?我应该如何执行多线程位图过滤以使其快速且线程安全?
bitmap.getPixels()
,但它也没有正常工作 - 存在未处理图像的碎片。不幸的是,我撤销了这些更改。也许以后我会再次编写此代码并显示输出结果。 - Mariusz Jaskółka