//从当前fbo缓存拷贝图像至bitmap
private int[] copyDataToBitmap(float viewPortHeight,Rect rect) {
int rectWidth = rect.width();
int rectHeight = rect.height();
IntBuffer intBuffer = IntBuffer.allocate(rectWidth * rectHeight);
GLES30.glReadPixels((int) rect.left, (int) (viewPortHeight - rect.bottom), rectWidth, rectHeight,
GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, intBuffer);
int[] array = intBuffer.array();
IntBuffer invertBuffer = IntBuffer.allocate(array.length);
for (int i = 0; i < rectHeight; i++) {
invertBuffer.put(array,(rectHeight-i-1) * rectWidth,rectWidth);
}
return invertBuffer.array();
}
//调试用
private void debug_cache(){
Bitmap bitmap_main = Bitmap.createBitmap((int)visibleWidth,(int)visibleHeight, Bitmap.Config.ARGB_8888);
bitmap_main.eraseColor(Color.RED);
int[] bitmapDataTest = copyDataToBitmap((int)visibleHeight,new Rect(0,0,(int)visibleWidth,(int)visibleHeight));
bitmap_main.setPixels(bitmapDataTest, 0, (int)visibleWidth, 0, 0, (int)visibleWidth,(int)visibleHeight);
//输出到图片
long timeNow=System.nanoTime();
saveBitmapAsPng(bitmap_main,""+timeNow+"drawPredictPoint"+"_start.png");
}
public static void mkdir(String dir) {
File f = new File(dir);
if (!f.exists())
f.mkdirs();
}
public static void saveBitmapAsPng(Bitmap bmp, String name) {
try {
String dir="/storage/emulated/0/Android/data/com.sunia.PenEngine/files/Documents/log_img/";
mkdir(dir);
File f = new File(dir+name);
FileOutputStream out = new FileOutputStream(f);
bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
自动获取纹理宽高
private Bitmap copyDataToBitmap(int fboId,boolean isFilp) {
GLES30.glBindFramebuffer(GL_FRAMEBUFFER, fboId);
GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, fboId);
int[] texDims = new int[2];
GLES31.glGetTexLevelParameteriv(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_TEXTURE_WIDTH, texDims, 0);
GLES31.glGetTexLevelParameteriv(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_TEXTURE_HEIGHT, texDims, 1);
int rectWidth = texDims[0];
int rectHeight = texDims[1];
IntBuffer intBuffer = IntBuffer.allocate(rectWidth * rectHeight);
GLES30.glReadPixels(0, 0, rectWidth, rectHeight,
GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, intBuffer);
if(isFilp) { //上下颠倒
int[] array = intBuffer.array();
IntBuffer invertBuffer = IntBuffer.allocate(array.length);
for (int i = 0; i < rectHeight; i++) {
invertBuffer.put(array, (rectHeight - i - 1) * rectWidth, rectWidth);
}
intBuffer=invertBuffer;
}
int[] array = intBuffer.array();
if(true){//ABGR to ARGB
for(int i = 0; i < rectWidth*rectHeight; i++){
int color=array[i];
array[i]= (color&0xFF000000) | (((color>>16)&0xFF)) | (((color>>8)&0xFF) << 8) | ((color&0xFF)<<16); //ABGR to ARGB
}
}
Bitmap bitmap_main = Bitmap.createBitmap((int)rectWidth,(int)rectHeight, Bitmap.Config.ARGB_8888);
bitmap_main.eraseColor(Color.RED);
bitmap_main.setPixels(array, 0, (int)rectWidth, 0, 0, (int)rectWidth,(int)rectHeight);
// bitmap_main.copyPixelsFromBuffer(intBuffer);
return bitmap_main;
}
自动获取纹理宽高,效率高点
private Bitmap copyDataToBitmap(int fboId) {
GLES30.glBindFramebuffer(GL_FRAMEBUFFER, fboId);
GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, fboId);
int[] texDims = new int[2];
GLES31.glGetTexLevelParameteriv(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_TEXTURE_WIDTH, texDims, 0);
GLES31.glGetTexLevelParameteriv(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_TEXTURE_HEIGHT, texDims, 1);
int rectWidth = texDims[0];
int rectHeight = texDims[1];
IntBuffer intBuffer = IntBuffer.allocate(rectWidth * rectHeight);
GLES30.glReadPixels(0, 0, rectWidth, rectHeight,
GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, intBuffer);
Bitmap bitmap_main = Bitmap.createBitmap((int)rectWidth,(int)rectHeight, Bitmap.Config.ARGB_8888);
bitmap_main.eraseColor(Color.RED);
bitmap_main.copyPixelsFromBuffer(intBuffer); //颜色通道顺序正常rgb
return bitmap_main;
}