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.
Gracias a su respuesta, le otorgué una recompensa. – ArtemStorozhuk
@Astor: feliz de ayudarte. ¿Has probado alguna de mis sugerencias por casualidad? Me interesará ver qué datos realmente se devuelven. –
getPixelFormatInfo pone su resultado en un objeto PixelFormat, que tiene 2 campos: bitsPerPixel (32) y bytesPerPixel (4). – xastor