【问题标题】:Faster way to redraw a bitmap in android?在android中重绘位图的更快方法?
【发布时间】:2014-07-17 02:16:52
【问题描述】:

我正在为 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));
        }
    }

【问题讨论】:

  • getPixels() 和 setPixels 将在一次调用中获取它们(并在一次调用中设置它们)。没有真正的方法可以避免循环遍历所有像素,但是将查找次数减少到 1 可能会加快速度。
  • Gabe,谢谢,速度提升非常大。从平均 3.4 秒到平均 169 毫秒

标签: java android performance


【解决方案1】:

只是想跟进并发布代码,以了解是否有人通过搜索找到此内容。

我在问题中的代码平均耗时 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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那只会在多处理器设备上加速,对吗?
    【解决方案3】:

    我通常在 Jni 上使用 OpenCV 处理图像。它比在 Java 上处理要快得多。如果您不熟悉 JNI,请参考此链接。 What is JNI Graphics or how to use it? 也可以分割图片,然后多线程处理!

    【讨论】:

      猜你喜欢
      • 2011-11-29
      • 2013-11-06
      • 2011-10-14
      • 2015-04-14
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多