Есть ли более быстрый способ обработки массивов в Java-Android? - PullRequest
2 голосов
/ 20 января 2012

У меня есть растровое изображение, которое я загружаю каждый пиксель в массив. Позже я пробегаю данные каждого пикселя массива и проверяю, является ли цвет КРАСНЫМ, и меняю его на ЧЕРНЫЙ. Так что, если это изображение 1024x1024, мне нужно пройти через массив длиной 1048576. Есть ли более быстрый способ обработать это. Любые советы по улучшению производительности приветствуются. Мне нужно проверить цвет изображения и изменить его. Ниже приведен пример кода.

int[] allpixels = new int[myBitmap.getHeight() * myBitmap.getWidth()];

myBitmap.getPixels(allpixels, 0, myBitmap.getWidth(), 0, 0,
                   myBitmap.getWidth(), myBitmap.getHeight());

for (int i = 0; i < myBitmap.getHeight() * myBitmap.getWidth(); i++) {
    if (allpixels[i] == fromColor) {
        allpixels[i] = toColor;
    }
}
Bitmap bitmapCopy = myBitmap.copy(myBitmap.getConfig(), true); 
bitmapCopy.setPixels(allpixels, 0, myBitmap.getWidth(), 0, 0,
                     myBitmap.getWidth(), myBitmap.getHeight());

1 Ответ

1 голос
/ 20 января 2012

В своем выражении сравнения для цикла for вы получаете высоту и ширину и умножаетесь каждый раз. Вы можете кешировать это. Это должно немного повысить производительность, но в остальном это просто большая работа, которую требует ваш алгоритм. Там нет тонны, вы можете с этим поделать. Как указано в комментарии выше, вы можете многопоточить его, но нет гарантии, что у вас есть несколько ядер / процессоров. Если производительность настолько важна, вы можете рассмотреть возможность использования RenderScript, если вам может потребоваться ICS. Смотрите этот пост об обработке изображений для более подробной информации.

На самом деле другой подход, который вы можете попробовать, это использовать setColorFilter . Может потребоваться два приложения, чтобы получить маску с оригинальным цветом, а затем повторно применить маску с новым цветом.

...