在安卓系统中重绘位图的更快方法是什么?

3

我正在为OCR处理图像,需要更改位图中一堆像素的颜色。除了使用setPixel和getPixel之外,是否有更快的方法?目前我只是用一个for循环和一个检查输入与一堆RGB值匹配并返回true的方法来完成。非常感谢!

    Bitmap img = myImage.copy(Bitmap.Config.ARGB_8888, true);;

    for (int w = 0; w < img.getWidth(); w++) {
        for (int h = 0; h < img.getHeight(); h++) {
            int value = img.getPixel(w, h);
            if (filter(value)) {
                img.setPixel(w, h, Color.rgb(0, 0, 0));
            } else img.setPixel(w, h, Color.rgb(255, 255, 255));
        }
    }

1
getPixels()和setPixels将在一个调用中获取它们(并在一个调用中设置它们)。没有真正的方法可以避免循环所有像素,但将查找次数减少到1可能会加快速度。 - Gabe Sechan
Gabe,谢谢,加速效果非常明显。从平均3.4秒降到了平均169毫秒。 - Daniel H
3个回答

6

我想跟进并发布代码,以便任何人通过搜索找到。

我的问题中的代码平均需要3.4秒,使用下面的代码(使用Gabe的建议)只需要不到200毫秒。我还添加了一个长度变量,因为我读到每次迭代不调用array.length()可能会提高性能,但在测试中似乎没有太大的好处。

    int width = img.getWidth();
    int height = img.getHeight();
    int length = width * height;
    int[] pixels = new int[width*height];
    img.getPixels(pixels, 0, width, 0, 0, width, height);

    for (int i = 0; i < length; i++) {
        if (filter(pixels[i])) {
            pixels[i] = Color.rgb(0, 0, 0);
        } else pixels[i] = Color.rgb(255, 255, 255);
    }

    img.setPixels(pixels, 0, width, 0, 0, width, height);

0
你可以尝试将图像分成四个象限/网格,并为每个象限分配一个单独的线程。

这会在多处理器设备上加速运行,对吗? - Daniel H

0

我通常使用OpenCV在Jni上处理图片。它比Java上的处理速度快得多。如果您不熟悉JNI,请参考此链接.什么是JNI图形或如何使用它? 您还可以将图像分割然后使用多线程进行处理!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接