2011-01-17 2 views
4

Все,повышения скорости GetPixel() и SetPixel() на Android Bitmap

После того как я заметил, как медленно getPixel и setPixel являются (не уверен, какой из них, думаю, оба не турбированный) Я быстро закодированы контейнер для Bitmap который использует массив int[] для обработки растровых операций.

Уже - его заметно быстрее, но этого недостаточно. Пожалуйста, вы могли бы посоветовать, как ускорить его?

Моя идея заключается в том, чтобы следить за то, что сделал «грязный» по setPixel функций и обновить только эту часть Bitmap когда getBitmap() называется ... не ясно, о том, как установить параметры setPixels хотя (что-то с офсетных и шаг, я думаю).

Также - любой более быстрый рецепт?

Благодарим за помощь!

import android.graphics.Bitmap; 

public class DrawableBitmapContainer { 
private Bitmap image; 
private int width, height; 
private int[] pixels; 
public DrawableBitmapContainer(Bitmap _source){ 
    image = _source; 
    width = image.getWidth(); 
    height = image.getHeight(); 
    pixels = new int[width*height]; 
    image.getPixels(pixels,0,width,0,0,width,height); 
} 
public int getPixel(int x,int y){ 
    return pixels[x+y*width]; 
} 
public void setPixel(int x,int y, int color){ 
    pixels[x+y*width]=color; 
} 
public Bitmap getBimap(){ 
    image.setPixels(pixels,0,width,0,0,width,height); 
    return image; 
} 
public int getWidth(){ 
    return image.getWidth(); 
} 
public int getHeight(){ 
    return image.getHeight(); 
} 
} 
+0

Надеюсь, вы поймете, что ваш растровый рисунок занимает 2-кратный объем памяти, а также ваш setpixel не работает. Этот массив является только копией матрицы изображения внутри фактического растрового изображения. Поэтому, изменяя значения в нем, они не сохраняются до тех пор, пока вы не вернете этот буфер обратно в объект растрового изображения. –

+0

Я понимаю его в два раза больше памяти (стоит скорость в моем использовании), но я потерял ваш комментарий, что setpixel не работает - он работает, если я обращаюсь к растровому изображению с помощью метода getBitmap, и это то, что я хотел. – Piotr

ответ

4

Для функций как просто, как setPixel/getPixel, накладные расходы на вызов функции является относительно большим.

Было бы намного быстрее получить доступ к массиву pixels, а не через эти функции. Конечно, это означает, что вы должны сделать pixels общедоступным, что не очень приятно с точки зрения дизайна, но если вам абсолютно нужна вся производительность, которую вы можете получить, это путь.

См. Также Designing for performance в документах для Android.

Если этого еще недостаточно, подумайте о кодировании ваших растровых операций на C++ с помощью NDK.

+0

спасибо - есть ли способ определить «макрос», который позволит мне использовать getPixel (x, y) – Piotr

0

другой вариант использует android ndk. когда дело доходит до того, что у вас очень мало помощи, но это действительно увеличивает скорость.

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