una solo samsung puedo porque pantalla movil hacer hace como celular capturas captura app aplicacion android opengl-es

android - samsung - mi movil hace capturas de pantalla solo



Tomando captura de pantalla de Android OpenGL (3)

¡Lo tengo!

Mi error fue que estaba recordando el contexto de GL en la variable de clase. Para tomar una captura de pantalla, tengo que usar el contexto gl pasado a OnDraw en la clase que implementa la interfaz GLSurfaceView.Renderer. Simplemente uso mi código en la cláusula "si" y todo funciona como se espera. Espero que ese comentario ayude a cualquiera.

Saludos cordiales, Gordon

Estoy tratando de tomar una captura de pantalla de Android OpenGL.

El código que encontré es el siguiente:

nt size = width * height; ByteBuffer buf = ByteBuffer.allocateDirect(size * 4); buf.order(ByteOrder.nativeOrder()); glContext.glReadPixels(0, 0, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, buf); int data[] = new int[size]; buf.asIntBuffer().get(data); buf = null; Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); bitmap.setPixels(data, size-width, -width, 0, 0, width, height); data = null; short sdata[] = new short[size]; ShortBuffer sbuf = ShortBuffer.wrap(sdata); bitmap.copyPixelsToBuffer(sbuf); for (int i = 0; i < size; ++i) { //BGR-565 to RGB-565 short v = sdata[i]; sdata[i] = (short) (((v&0x1f) << 11) | (v&0x7e0) | ((v&0xf800) >> 11)); } sbuf.rewind(); bitmap.copyPixelsFromBuffer(sbuf); try { FileOutputStream fos = new FileOutputStream("/sdcard/screeshot.png"); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); } catch (Exception e) { // handle }

Intenté también un código de ese enlace del sitio .

En cada caso, el resultado es un archivo png que es completamente negro. Descubrí que hay algún problema con el método glReadPixels pero no sé cómo evitarlo.


Esta es la forma de hacerlo si desea conservar la calidad (8 bits para cada canal de color: rojo, verde, azul y alfa también):

if (this.screenshot) { int screenshotSize = this.width * this.height; ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4); bb.order(ByteOrder.nativeOrder()); gl.glReadPixels(0, 0, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb); int pixelsBuffer[] = new int[screenshotSize]; bb.asIntBuffer().get(pixelsBuffer); bb = null; for (int i = 0; i < screenshotSize; ++i) { // The alpha and green channels'' positions are preserved while the red and blue are swapped pixelsBuffer[i] = ((pixelsBuffer[i] & 0xff00ff00)) | ((pixelsBuffer[i] & 0x000000ff) << 16) | ((pixelsBuffer[i] & 0x00ff0000) >> 16); } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixelsBuffer, screenshotSize-width, -width, 0, 0, width, height); this.screenshot = false; }


Lo siento por la respuesta tardía...

Para realizar una captura de pantalla correcta, debe colocar el siguiente código en el controlador onDrawFrame (GL10 gl):

if(screenshot){ int screenshotSize = width * height; ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4); bb.order(ByteOrder.nativeOrder()); gl.glReadPixels(0, 0, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb); int pixelsBuffer[] = new int[screenshotSize]; bb.asIntBuffer().get(pixelsBuffer); bb = null; Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); bitmap.setPixels(pixelsBuffer, screenshotSize-width, -width, 0, 0, width, height); pixelsBuffer = null; short sBuffer[] = new short[screenshotSize]; ShortBuffer sb = ShortBuffer.wrap(sBuffer); bitmap.copyPixelsToBuffer(sb); //Making created bitmap (from OpenGL points) compatible with Android bitmap for (int i = 0; i < screenshotSize; ++i) { short v = sBuffer[i]; sBuffer[i] = (short) (((v&0x1f) << 11) | (v&0x7e0) | ((v&0xf800) >> 11)); } sb.rewind(); bitmap.copyPixelsFromBuffer(sb); lastScreenshot = bitmap; screenshot = false; }

El campo de clase de "captura de pantalla" se establece en verdadero cuando el usuario presiona el botón para crear una captura de pantalla o en cualquier otra circunstancia que desee. Dentro del cuerpo "si", puede colocar cualquier ejemplo de código de creación de captura de pantalla que encuentre en Internet; lo más importante es tener la instancia actual de GL10. Por ejemplo, cuando solo guardas la instancia de GL10 en la variable de clase y luego la usas fuera del evento para crear la captura de pantalla, terminarás con la imagen completamente en blanco. Es por eso que tiene que tomar una captura de pantalla dentro del controlador de eventos OnDrawFrame donde la instancia de GL10 es la actual. Espero que ayude.

Saludos cordiales, Gordon.