Android - 在画布上绘制RGB位图数据的最佳方法?

时间:2013-09-10 20:39:52

标签: android android-ndk

民间,

在我的Android应用程序中,需要在Canvas视图中显示来自外部源的视频流。从我的Java代码中,我通过JNI将ByteBuffer传递给底层C ++库。该库对流进行解码,并在ByteBuffer中构建RGB位图图像并将其返回。

现在,在我的Java代码中,我有一个包含RGB值的宽度,高度和行的ByteBuffer。我现在可以在for循环中绘制它:

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数据的布局在我的控制之下。也许我可以重新安排它以获得更好的性能。

提前感谢您的帮助。

的问候,
彼得

3 个答案:

答案 0 :(得分:0)

阅读此Android API“高效加载大位图”官方指南。您将使用BitmapFactory,这是一个专门为它准备的类,并且可能像其他sdk类一样以优化的方式进行。这里有链接:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

答案 1 :(得分: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;

     }

答案 2 :(得分:0)

我能够在适当的时候调整this question的代码来解码(Byte [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);