Java-Android位图多线程处理-不是线程安全的?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java-Android位图多线程处理-不是线程安全的?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1577字,纯文字阅读大概需要3分钟。
内容图文
![Java-Android位图多线程处理-不是线程安全的?](/upload/InfoBanner/zyjiaocheng/681/7cb763954f2540e390c8694447541de0.jpg)
我想在我的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个)时,结果如下所示(对于灰度滤镜):
有时看起来像:
> bitmap.getPixels(…)不起作用,因为输出中有黑线
> bitmap.setPixels(…)不起作用,因为输出中没有更改的行
我对吗?难道这些功能线程安全的?如何执行快速且线程安全的多线程位图过滤?
解决方法:
Skia库提供了Android中的2D图像处理功能,Chrome也使用了该功能.
很难找到一个明确的答案. “ Skia不是线程安全的,尽管[Bitmap使用的SkBitmap]是线程安全的……”我不知道该怎么想.我细读了一堆难以理解的JNI / C代码,这是我所能提供的最好的(似乎比其他任何人都可以做到):
我认为您应该在整个位图上调用bitmap.getPixels().然后将所得数组除以并进行处理.当所有线程完成后,重新组合结果并调用bitmap.setPixels()
看起来bitmap.getPixels()和bitmap.setPixels()应该只不过是memcpy(),但是在引用计数,图像缓存,色彩空间转换,预乘以及谁知道的背景下,还有很多事情要做还有什么.将Bitmap方法从并发处理中删除,可以避免麻烦.
内容总结
以上是互联网集市为您收集整理的Java-Android位图多线程处理-不是线程安全的?全部内容,希望文章能够帮你解决Java-Android位图多线程处理-不是线程安全的?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。