Conversión de Bitmaps a Byte Arrays con Extension Functions

Clase 24 de 33Curso de Android: Integración de APIs nativas

Resumen

Optimizar la separación por capas en tus proyectos Android suele requerir la transformación eficiente de Bitmaps en Byte Arrays y viceversa. En Kotlin, las extension functions ofrecen una forma sencilla y eficaz para realizar estas conversiones, especialmente si tu estructura multimodular necesita aislar la lógica de Android (Bitmaps) de las capas más puras en Java o Kotlin (Byte Arrays).

¿Por qué convertir de Bitmap a Byte Array en un proyecto multimodular?

Al dividir un proyecto por capas, la capa de domain típicamente no tiene dependencias relacionadas directamente con Android. Esto obliga a representar imágenes, inicialmente manejadas en la capa de presentación con Bitmaps, en un formato neutro y universal como Byte Arrays. De esta manera, mantenemos la estructura modular clara y las dependencias bajo control.

¿Cuál es la manera más eficiente de convertir Bitmaps a Byte Arrays en Kotlin?

Usando Kotlin, implementaremos estas conversiones mediante funciones de extensión rápidas y legibles:

Para convertir un Bitmap a Byte Array, sigue esta estructura simple:

fun Bitmap.toByteArray(quality: Int = 90, format: Bitmap.CompressFormat = Bitmap.CompressFormat.JPEG): ByteArray {
    val stream = ByteArrayOutputStream()
    this.compress(format, quality, stream)
    return stream.toByteArray()
}

Aquí, puedes ajustar fácilmente parámetros como la calidad y el formato de compresión según tus necesidades específicas.

¿Cómo transformar Byte Arrays en Bitmaps con Kotlin?

Realizar la operación opuesta también es sencillo con Kotlin. Transformar un Byte Array de nuevo a Bitmap requiere únicamente la utilización de la clase BitmapFactory:

fun ByteArray.toBitmap(): Bitmap? {
    return BitmapFactory.decodeByteArray(this, 0, this.size)
}

De esta manera, garantizas que las imágenes transportadas en tu lógica de dominio puedan fácilmente visualizarse en la capa Android.

¿Qué hay que considerar en la organización del código en proyectos modulares?

En estos proyectos, es clave que las operaciones específicas a Android, como la manipulación directa de Bitmaps, se mantengan rigurosamente en la capa de presentación. Es por ello recomendable mover clases asociadas principalmente con la interfaz de usuario, como el photo handler, hacia la capa de presentación, respetando así la integridad modular y la separación por responsabilidades.

¿Cómo configurar la inyección de dependencias en el módulo camera?

La configuración de tu clase de inyección para un módulo específico de cámara y su implementación es tan sencilla como:

@Module
@InstallIn(SingletonComponent::class)
object CameraModule {

    @Singleton
    @Provides
    fun providePhotoHandler(@ApplicationContext context: Context): PhotoHandler {
        return PhotoHandlerImplementation(context)
    }
}

Explora cómo implementar estas técnicas avanzadas y sencillas en tu proyecto Android multimodular y mejora así su modularidad y limpieza. ¿Tienes dudas sobre estos procesos? Cuéntanos en los comentarios.