使用glReadPixels从TextureSurface中提取像素,从而导致错误的图像Bitmap

时间:2016-06-09 12:41:09

标签: android opengl-es

我试图在Android中的SurfaceTexture视图中每隔几秒发送一次位图图像。我使用glReadPixels()读取像素,我得到的图像类似于

This

我的代码看起来像这样:

int size = this.width * this.height;
ByteBuffer bb = ByteBuffer.allocateDirect(size * 4);
bb.order(ByteOrder.nativeOrder());
gl.glReadPixels(0, 0, width, height, GL10.GL_RGB, GL10.GL_UNSIGNED_BYTE, bb);
int pixelsBuffer[] = new int[size];
bb.asIntBuffer().get(pixelsBuffer);
bb = null;
for(int i = 0; i < size; i++) {
    pixelsBuffer[i] = ((pixelsBuffer[i] & 0xff00ff00)) | ((pixelsBuffer[i] & 0x000000ff) << 16) | ((pixelsBuffer[i] & 0x00ff0000) >> 16);
}
Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
bm.setPixels(pixelsBuffer, size - width, -width, 0, 0, width, height);
if(now - init > 5000) {
      init = now;
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
      byte[] b = baos.toByteArray();
      String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
}

注意:现在和init只是currentTimeMillis()函数的长整数。

有谁知道什么是错的?或者有没有更好的方法将图像转换为base64字符串,因为我需要将其发送到服务器。

1 个答案:

答案 0 :(得分:0)

我可以自信的事情:

gl.glReadPixels(0, 0, width, height, GL10.GL_RGB, GL10.GL_UNSIGNED_BYTE, bb);

可能想成为:

gl.glReadPixels(0, 0, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb);

...否则每个像素将以三个字节的形式返回,然后可能以您不想要的方式间隔,除非您还调整了GL_PACK_ALIGNMENT。否则你的代码似乎假设有四个字节。

(编辑:这是&#34;常见错误之一:纹理上传和像素读取&#34;每the OpenGL.org wiki

我是这样的Java / Android笨蛋,我认为你有信心创建一个16位Bitmap.Config.RGB_565格式的位图但随后发布32通过setPixels生成数据。虽然看起来有点奇怪 - 特别是考虑到JPEG的深度不会Bitmap.Config.ARGB_8888更合适吗?