我试图在Android中的SurfaceTexture视图中每隔几秒发送一次位图图像。我使用glReadPixels()
读取像素,我得到的图像类似于
我的代码看起来像这样:
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字符串,因为我需要将其发送到服务器。
答案 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
更合适吗?