民间,
在我的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数据的布局在我的控制之下。也许我可以重新安排它以获得更好的性能。
提前感谢您的帮助。
的问候,
彼得
答案 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);