2011-01-19 21 views
5

He buscado mucho acerca de tomar una captura de pantalla de mi objeto OpenGL en Android y proponer la solución this. Funcionó muy bien, pero en mi caso tengo vista de cámara y vista abierta (con fondo transparente) en la parte superior de la vista de la cámara. Entonces, lo que quiero hacer es obtener una captura de pantalla opengl con fondo transparente en lugar de negro. Como dije, he intentado con el enlace de arriba y funcionó, pero estoy atascado con el fondo negro. Es un poco complicado averiguar cómo deshacerse del fondo negro en este caso particular. Espero que alguien pueda ayudarme y lo más posible si es posible (también creo que la solución es fácil, me falta algo simple). Gracias.Android OpenGL Captura de pantalla

Respuesta

13

Utilicé el siguiente método y funcionó como un campeón.

public static Bitmap SavePixels(int x, int y, int w, int h, GL10 gl) 
{ 
    int b[]=new int[w*(y+h)]; 
    int bt[]=new int[w*h]; 
    IntBuffer ib=IntBuffer.wrap(b); 
    ib.position(0); 
    gl.glReadPixels(x, 0, w, y+h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib); 

    for(int i=0, k=0; i<h; i++, k++) 
    {//remember, that OpenGL bitmap is incompatible with Android bitmap 
     //and so, some correction need.   
      for(int j=0; j<w; j++) 
      { 
       int pix=b[i*w+j]; 
       int pb=(pix>>16)&0xff; 
       int pr=(pix<<16)&0x00ff0000; 
       int pix1=(pix&0xff00ff00) | pr | pb; 
       bt[(h-k-1)*w+j]=pix1; 
      } 
    } 


    Bitmap sb=Bitmap.createBitmap(bt, w, h, Bitmap.Config.ARGB_8888); 
    return sb; 
} 

sólo tiene que llamar

YourClass.SavePixels(0,0,width,height,gl); 

espero que esto funcionará para usted ...

Gracias, Midhun

+0

¡Parece prometedor! Lo siento estado súper ocupado ... lo probaré pronto. –

+1

¡Ok funcionó! ¡gracias! –

+1

no funcionó para mí :( – Noman

5

La solución que mencionó está utilizando un Bitmap.Config.RGB_565 que no admite canales alfa.

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 

lugar debe usar Bitmap.Config.ARGB_8888 o Bitmap.Config.ARGB_4444.

+0

Gracias. Intenté usar ARGB_4444 y obtuve una imagen con colores desordenados (creo que algo cambió y tiene una apariencia divertida de muchos colores diferentes). Creo que necesito cambiar el algoritmo de conversión de píxeles a rgb. Cuando probé 8888 recibí un error sobre el tamaño del mapa de bits. ¿Cómo debería cambiar el tamaño? –

+0

ARGB_4444 'arruina' sus colores porque usa la mitad de la cantidad de espacio para guardar la misma información. Mientras que RGB_8888 usa 8 bits para cada canal (R, G, B y el canal alfa) RGB_4444 usa 4 bits para cada canal, lo que trunca la información y le da una muy mala calidad percibida. Los efectos más destacados son bandas y distorsión del color. Algunas técnicas de tramado intentan resolverlo, pero no sé si están disponibles de forma nativa en Android. Si 8888 le da un error de memoria, intente disminuir el tamaño del mapa de bits. Tal vez su dispositivo no tenga suficiente memoria RAM disponible. – RedOrav

+2

Incluso al usar Bitmap.Config.ARGB_8888, da un fondo negro. – pallavi

Cuestiones relacionadas