La columna 80

El blog técnico-personal de Ángel J. Vico… en español

Capturas de pantalla en firmwares Android de 24 BPP

Posted by Ángel J. Vico en 29 de mayo de 2011

Un efecto secundario de instalar un firmware no oficial, en algunos móviles (como el Samsung Galaxy Spica) y con algunos firmwares (como CyanogenMod), es que dejamos de poder hacer capturas de pantalla.

Ya sé que a la mayoría de vosotros es algo que os trae completamente sin cuidado, pero como yo me he llevado la sorpresa y he tenido que buscar cómo resolverlo, aprovecho y lo cuento. Seguro que hay alguien a quien le viene bien.

Comenzaré con una breve explicación de por qué con unos firmwares se pueden hacer capturas de pantalla y con otros no. La clave está en la profundidad de color. O, lo que es lo mismo, la cantidad de bits que se utilizan para representar cada color que se muestra en pantalla.

Como ya comenté en el post sobre la estructura de un proyecto Android, los colores se representan con 4 valores: los correspondientes a las cantidades de rojo, verde y azul (RGB) y del canal alfa (nivel de transparencia). Pero lo que no llegué a comentar es que esos valores se pueden representar con uno o dos dígitos hexadecimales.

Cada dígito hexadecimal utiliza 4 bits al almacenarse. Con 4 dígitos binarios se pueden representar 16 valores, tantos como dígitos hexadecimales distintos hay. De esta forma, si se usa un dígito hexadecimal para cada valor del color, se necesitarán 4×4=16 bits para representarlo. Análogamente, si usamos dos dígitos hexadecimales, cada color requerirá 32 bits.

Esa cantidad de bits es lo que se denomina profundidad de color. Las siglas BPP vienen de Bits Per Pixel. O sea, número de bits para representar el color de cada píxel (punto de la pantalla).

Debido a esta forma de representar los colores, Android está preparado para realizar capturas de pantalla si la profundidad de color es de 16 o 32 bits.  Normalmente, los firmwares suelen utilizar 16 BPP. Pero algunos firmwares no oficiales tratan de mejorar la visualización de los terminales aumentando la profundidad de color hasta los 24 BPP. Y con ese valor, Android no es capaz de realizar capturas de pantalla. Ni desde las herramientas del SDK ni con aplicaciones específicas.

Afortunadamente, existe una forma de realizar las capturas: leyendo directamente la memoria de vídeo del dispositivo. Y, por supuesto, existe también una forma de convertir ese volcado de memoria en una imagen utilizable: FFmpeg.

Lo primero es instalar FFmpeg. Si utilizamos Windows tendremos que descargar la versión apropiada (la más recomendable es la Static de 32 o 64 bits) desde esta dirección: http://ffmpeg.zeranoe.com/builds/. Para descomprimirla necesitaremos 7zip. De todos los archivos incluidos en el paquete, el único que necesitamos es ffmpeg.exe.

En Linux dependerá de la distribución que utilicemos. Si tenemos una Ubuntu o similar, podemos instalarlo con el siguiente comando:

sudo apt-get install ffmpeg

En ambos casos necesitaremos tener instalado el SDK de Android y poder acceder al teléfono con él, conectándolo por USB.

Una vez conectado el teléfono al PC, podemos obtener el volcado de la memoria de vídeo por medio de la utilidad adb del SDK:

adb pull /dev/graphics/fb0 imagen.raw

Esto nos creará el archivo imagen.raw, que contiene lo que se esté mostrando en pantalla en ese momento. Para convertirlo en una imagen normal hay que utilizar el siguiente comando (tanto en Windows como en Linux):

ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 320x480 -i imagen.raw -f image2 -vcodec png imagen.png

Con este comando obtendremos el archivo imagen.png, que podemos abrir con cualquier visor de imágenes.

Un par de notas sobre este último comando:

  • El parámetro –s sirve para especificar la resolución de pantalla del dispositivo. 320×480 es una de las más habituales, pero si tu dispositivo tiene una diferente, tendrás que ponerla en su lugar.
  • Si queremos obtener la imagen en otro formato que no sea png, podemos ponerlo en el parámetro –vcodec, cambiando también la extensión del archivo resultante (último parámetro de la llamada a ffmpeg).

Recuerda que en esta página dispones de enlaces a todos los artículos sobre Android que he publicado en La columna 80.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s