2013-09-10 3 views
1

Люди,Android - Лучший способ рисовать растровые данные RGB на холсте?

В моем приложении Android поток видео с внешнего источника должен отображаться на холсте. Из моего кода Java я передаю ByteBuffer в базовую библиотеку C++ через JNI. Библиотека декодирует поток и создает растровое изображение RGB в ByteBuffer и возвращает его обратно.

Теперь, в моем Java-коде, у меня есть ByteBuffer, который содержит ширину, высоту и строки значений RGB. Теперь я мог сделать это в цикле:

for(int y=0;y<height;y++) { 
    for(int x=0;x<width;x++) { 
     get the right RGB value from ByteBuffer and draw the pixel 
    } 
} 

мне интересно, если есть более эффективный способ сделать это? Любые идеи были бы хорошы.

Макет данных ByteBuffer находится под моим контролем. Возможно, я смогу переставить его для лучшей производительности.

Заранее благодарю вас за помощь.

С уважением,
Питер

+0

Является ли видеопоток декодированным программным декодером или «MediaCodec»? – fadden

ответ

0

Читать это Android API "Загрузка больших растровых изображений ЭФФЕКТИВНО" официальное руководство. Вы будете использовать BitmapFactory, это класс, созданный именно для него, и, вероятно, сделать это оптимизированным способом, как и другие классы sdk. Здесь ссылка: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

0

эффективный способ позвонить по телефону copyPixelsFromBuffer. Не рисуйте пиксель один за другим. вам просто нужно управлять массивом int и объединять их. Например:

int[] data8888 = new int[N]; 
for (int i = 0; i < N; i++) { 

     data8888[i] = 78255360; 

     } 
mBitmap.copyPixelsFromBuffer(makeBuffer(data8888, N)); 

private static IntBuffer makeBuffer(int[] src, int n) { 

     IntBuffer dst = IntBuffer.allocate(n); 

     for (int i = 0; i < n; i++) { 

      dst.put(src[i]); 

     } 

     dst.rewind(); 

     return dst; 

    } 
0

я смог адаптировать код из this question для декодирования (Байт [3]) RGB-потоки с другой день. Вероятно, его нужно будет оптимизировать для вашего приложения, но это был самый простой способ, который я нашел до сих пор.

Byte[] bytesImage = {0,1,2, 0,1,2, 0,1,2, 0,1,2}; 
int intByteCount = bytesImage.length; 
int[] intColors = new int[intByteCount/3]; 
int intWidth = 2; 
int intHeight = 2; 
final int intAlpha = 255; 
if ((intByteCount/3) != (intWidth * intHeight)) { 
    throw new ArrayStoreException(); 
} 
for (int intIndex = 0; intIndex < intByteCount - 2; intIndex = intIndex + 3) { 
    intColors[intIndex/3] = (intAlpha << 24) | (bytesImage[intIndex] << 16) | (bytesImage[intIndex + 1] << 8) | bytesImage[intIndex + 2]; 
} 
Bitmap bmpImage = Bitmap.createBitmap(intColors, intWidth, intHeight, Bitmap.Config.ARGB_8888); 
Смежные вопросы