2012-08-14 20 views
12

Estoy confundido acerca de PixelFormat en Android.Confundido acerca de PixelFormat

Mi dispositivo es Motorola Defy.

Tengo dos preguntas:

  • En Android 2.3 getWindowManager().getDefaultDisplay().getPixelFormat() devuelve Lo que se destaca por RGB_565. En lo que a saber si el dispositivo tiene 16M colores, que significa 3 (o 4 con el canal alfa) bytes por píxel:
   2^(8*3) = 2^24 = 16M 

Pero RGB_565 formato tiene 2 bytes (16 bits) por píxel, lo que significa 65K colores:

   2^(8*2) = 2^16 = 65K 

Entonces, ¿por qué getPixelFormat() no devuelve formato con 3 (o 4 como RGBA) bytes por píxel? ¿Hay problemas con el controlador de pantalla o algo así? ¿Puedo establecer PixelFormat en RGBA_8888 (o analógico)?

  • En Android 4.1 (ROM personalizada), getPixelFormat() vuelve . Pero este valor no está documentado. Que significa? En realidad, en esta situación, el efecto es el mismo que con la constante 4. Pero de this discussion encontré que significa RGBA_8888 (pero no hay pruebas para esa declaración). Entonces, ¿cómo puedo averiguar el real formato de la pantalla del dispositivo? También encontré un dispositivo chino en Android 2.2, que también tiene PixelFormat , pero el formato real es (como mi Motorola).

He buscado estas preguntas en Google y no he encontrado nada. Lo único que encontré es que nexus 7 also has 5 format.

Actualización:

encontré método getWindow().setFormat() pero en realidad no cambia el formato principal de píxeles.

Respuesta

6

voy a añadir mi granito de arena a esta discusión, aunque debo admitir de antemano que no pude encontrar respuestas concluyentes a todas sus preguntas.

Así que, ¿por qué no getPixelFormat() formato de regresar con 3 (o 4 como RGBA) bytes por píxel? ¿Hay problemas con el controlador de pantalla o algo así? ¿Puedo establecer PixelFormat en RGBA_8888 (o análogo)?

Estoy un poco confundido acerca de lo que estás preguntando exactamente aquí. El valor de retorno de getPixelFormat() es solo un número entero que proporciona una forma de identificar el formato de píxel activo; no pretende representar ningún dato compactado en un número (por ejemplo, como en MeasureSpec). Desafortunadamente, no tengo una explicación de por qué se devuelve un producto diferente al que esperaba. Lo mejor que puedo pensar es que se debe a una decisión del sistema operativo, ya que no parece haber una limitación desde el punto de vista del hardware o, alternativamente, las constantes definidas en la implementación nativa no coinciden con las de Java. El hecho de que obtenga un 4 como formato de píxel no significa necesariamente que sea realmente RGB_565, si Motorola dañó las definiciones.

En una nota: he hecho venir a través de las definiciones constantes desalineados antes en Android, aunque no puedo recordar dónde exactamente actualmente ...

sólo para confirmar, puede valer la pena imprimir el píxel detalles del formato en tiempo de ejecución. Si de hecho hay una constante nativa definida que usa un valor Java PixelFormat pero no coincide, posiblemente podría revelar el formato 'real' de esta manera. Use el método getPixelFormatInfo(int format, PixelFormat info), que simplemente delega la recuperación de los valores reales de la implementación nativa.

En Android 4.1 (rom personalizado), getPixelFormat() devuelve 5. Pero este valor no está documentado. Que significa?

Como se mencionó anteriormente, a veces las constantes definidas en el código nativo no coinciden con las de Java, o no se definen en absoluto. Este es probablemente un caso así.Vas a tener que hacer algo de investigación para averiguar lo que representa, pero es bastante sencillo:

/** 
* pixel format definitions 
*/ 

enum { 
    HAL_PIXEL_FORMAT_RGBA_8888   = 1, 
    HAL_PIXEL_FORMAT_RGBX_8888   = 2, 
    HAL_PIXEL_FORMAT_RGB_888   = 3, 
    HAL_PIXEL_FORMAT_RGB_565   = 4, 
    HAL_PIXEL_FORMAT_BGRA_8888   = 5, 
    HAL_PIXEL_FORMAT_RGBA_5551   = 6, 
    HAL_PIXEL_FORMAT_RGBA_4444   = 7, 
    /* 0x8 - 0xF range unavailable */ 
    HAL_PIXEL_FORMAT_YCbCr_422_SP  = 0x10,  // NV16 
    HAL_PIXEL_FORMAT_YCrCb_420_SP  = 0x11,  // NV21 (_adreno) 
    HAL_PIXEL_FORMAT_YCbCr_422_P  = 0x12,  // IYUV 
    HAL_PIXEL_FORMAT_YCbCr_420_P  = 0x13,  // YUV9 
    HAL_PIXEL_FORMAT_YCbCr_422_I  = 0x14,  // YUY2 (_adreno) 
    /* 0x15 reserved */ 
    HAL_PIXEL_FORMAT_CbYCrY_422_I  = 0x16,  // UYVY (_adreno) 
    /* 0x17 reserved */ 
    /* 0x18 - 0x1F range unavailable */ 
    HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED = 0x20,  // NV12_adreno_tiled 
    HAL_PIXEL_FORMAT_YCbCr_420_SP  = 0x21,  // NV12 
    HAL_PIXEL_FORMAT_YCrCb_420_SP_TILED = 0x22,  // NV21_adreno_tiled 
    HAL_PIXEL_FORMAT_YCrCb_422_SP  = 0x23,  // NV61 
    HAL_PIXEL_FORMAT_YCrCb_422_P  = 0x24,  // YV12 (_adreno) 
}; 

Source: hardware.h (lines 121-148)

Si tuviera que comparar los valores con los definidos en PixelFormat.java, encontrará se suman bastante bien (como deberían). También muestra el significado del misterioso 5, que es BGRA_8888; una variante de RGBA_8888.

Por cierto, es posible que desee intentar determinar los detalles de formato de píxel para este valor entero utilizando el método getPixelFormatInfo(...) antes mencionado al pasar en 5 como identificador. Será interesante ver qué se devuelve. Esperaría que muestre valores que coincidan con la definición de BGRA_8888 y, por lo tanto, similares a los que se dan en la discusión vinculada en la placa de Motorola.

+0

Gracias a su respuesta, le otorgué una recompensa. – ArtemStorozhuk

+0

@Astor: feliz de ayudarte. ¿Has probado alguna de mis sugerencias por casualidad? Me interesará ver qué datos realmente se devuelven. –

+1

getPixelFormatInfo pone su resultado en un objeto PixelFormat, que tiene 2 campos: bitsPerPixel (32) y bytesPerPixel (4). – xastor

4

De acuerdo con this hilo en los foros de motodev, el valor de retorno 5 corresponde a RGBA_8888. El hilo indica que la documentación de PixelFormat está incompleta y desactualizada, y links to a bug que se archivó para ello. Sin embargo, el enlace a ese error ahora devuelve un 404.

Además, yo no era capaz de encontrar cualquier cosa en el PixelFormat source code (4.1) que apoya esta afirmación, ya que por allí RGBA_8888 se le asigna el valor 1.

Supongo que este valor es específico de Motorola y algunos otros dispositivos, ya que estoy viendo la misma salida en mi Nexus 7 y Galaxy Nexus.

EDITAR: Envié un correo electrónico a un empleado de Google sobre esto, y él me dijo que 5 correspondían a BGRA_8888, como se indica en la respuesta de MH y en el hilo del foro de Motorola que he vinculado anteriormente. Me recomendó que archivara un error para el problema de documentación, which I have done. Por favor, marque el informe de error para que la acción se tome más temprano que tarde.

+1

Esto no es cierto que 5 representa RGBA_8888 (incluso no hay ningún enlace de prueba de ese tipo). Actally formato 4 (RGB_565) funciona bien (lo mismo que en Android 2.3) en ICS o Jelly Bean. Si fue RGBA_8888 de lo que podría tener problemas con el color. – ArtemStorozhuk

+1

Como dije en mi segundo punto, tampoco pude encontrar pruebas de sus afirmaciones. Sin embargo, la otra persona en el hilo ejecutó algunas pruebas que indicaban que era RGBX_8888 o RGBA_8888. –

+0

De todos modos, gracias por su respuesta (+1). – ArtemStorozhuk

3

RGBA_8888 corresponde a 1 como se puede ver en el anexo a continuación.

Si va al código relacionado con mPixelFormat encontrará lo siguiente.

// Following fields are initialized from native code 
private int mPixelFormat; 

Eso significa que por alguna razón el dispositivo está siendo tratado como RGB_565 debido a una decisión OS más de las capacidades del hardware. En realidad, eso me hace sentir curiosidad.

Curiosamente, las descripciones de Galaxy Nexus y Nexus 7 no parecen tener demasiado en común. GNN7

public static final int RGBA_8888 = 1; 
public static final int RGBX_8888 = 2; 
public static final int RGB_888  = 3; 
public static final int RGB_565  = 4; 

@Deprecated 
public static final int RGBA_5551 = 6; 
@Deprecated 
public static final int RGBA_4444 = 7; 
public static final int A_8   = 8; 
public static final int L_8   = 9; 
@Deprecated 
public static final int LA_88  = 0xA; 
@Deprecated 
public static final int RGB_332  = 0xB; 
+0

Gracias a su respuesta (+1), pero no me sirve para nada :( – ArtemStorozhuk

+0

¿Qué está tratando de averiguar? ¿Esto hace la diferencia en cualquier otra cosa que no sea el hecho de conocer este detalle? –

+0

¿Qué formato tiene? 5 stand for? ¿Cómo puedo configurar el formato de la vista en el formato real de la pantalla del dispositivo? – ArtemStorozhuk

Cuestiones relacionadas