android opengl用textureId 保存图片,具体代码
时间: 2024-03-26 20:38:15 浏览: 111
以下是在 Android OpenGL 中使用 textureId 保存图片的示例代码:
```java
// 创建一个 textureId
int[] textureId = new int[1];
GLES20.glGenTextures(1, textureId, 0);
// 绑定 textureId
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0]);
// 设置纹理过滤参数
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
// 加载图片到纹理
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.texture);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
// 解绑 textureId
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
// 保存纹理到文件
int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
ByteBuffer buffer = ByteBuffer.allocateDirect(bitmap.getWidth() * bitmap.getHeight() * 4);
for (int y = 0; y < bitmap.getHeight(); y++) {
for (int x = 0; x < bitmap.getWidth(); x++) {
int pixel = pixels[y * bitmap.getWidth() + x];
buffer.putInt((pixel >> 16) & 0xFF);
buffer.putInt((pixel >> 8) & 0xFF);
buffer.putInt((pixel >> 0) & 0xFF);
buffer.putInt((pixel >> 24) & 0xFF);
}
}
buffer.flip();
FileOutputStream fos = new FileOutputStream(new File("/sdcard/texture.bin"));
fos.getChannel().write(buffer);
fos.close();
```
在这个示例中,我们先创建了一个 textureId,然后绑定它,并设置了纹理过滤参数。接下来,我们使用 GLUtils.texImage2D() 方法将图片加载到纹理中。最后,我们解绑 textureId,将纹理保存到文件中。
需要注意的是,保存纹理到文件需要将每个像素的颜色值保存为一个四字节的整数,这里我们使用 ByteBuffer 来实现。同时,我们将保存的文件后缀名设置为 .bin,这是因为保存的不是图片,而是纹理数据。如果需要将保存的纹理数据读取回来,可以使用类似的方法将数据读取到 ByteBuffer 中,然后使用 GLES20.glTexImage2D() 方法将纹理数据加载到 textureId 中。
阅读全文