2012-01-20 7 views
2

У меня есть растровое изображение, которое я загружаю каждый пиксель в массив. Позже я просматриваю данные каждого пикселя массива и проверяю, является ли цвет RED и изменяет его на BLACK. Поэтому, если это изображение 1024x1024, мне нужно пройти через массив длиной 1048576. Есть ли более быстрый способ обработать это. Любые рекомендации по повышению производительности приветствуются. Мне в основном нужно проверить цвет в изображении и изменить его. Ниже приведен пример моего кода.Есть ли более быстрый способ обработки массивов в java-андроиде?

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()); 
+0

Похоже, вы можете использовать несколько потоков здесь. –

+1

звучит как ваш случай http://stackoverflow.com/questions/4251027/faster-way-to-set-a-png-bitmap-color-instead-of-pixel-by-pixel –

+0

Спасибо @Sergey Benner. это сработало для меня. – Vinodtiru

ответ

1

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

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

Смежные вопросы