Rellenar los datos en un mapa de bits de Android tan pronto como sea posible desde C
He conseguido obtener un android.graphics.Bitmap creado y lo estoy llenando con éxito a través del comando SetPixels.
El problema es que comienzo con datos RGBA. A continuación, crear un jintArray. A continuación, llamar SetIntArray (efectivamente memcpying los datos en el búfer). Entonces, finalmente, yo llamo setPixels para realmente establecer los píxeles (que presumiblemente causa otra copia).
- ¿Cómo tener una imagen circular, centro-recortada, sin crear un nuevo mapa de bits?
- Cómo devolver el mapa de bits de la actividad secundaria en android
- error: método ejecutado en la clase AsyncTask <Params, Progress, Result> no se puede aplicar a tipos dados
- ¿Cómo hacer efecto de resplandor alrededor de un mapa de bits?
- Compartir Bitmap () en android para twitter, facebook, correo
Un problema grande con hacer esto es que si utilicé R8G8B8A8 o R5G6B5 o A8 todavía tengo que convertir mis datos del pixel a los datos de R8G8B8A8.
Lo ideal sería que me gustaría una forma de llenar el búfer utilizando sólo una copia y permítanme hacerlo sin hacer la conversión de formato de píxeles.
¿Hay alguna forma de obtener directamente los datos de búfer contenidos en un mapa de bits? Veo que hay una función GetDirectBufferAddress en el JNI, pero la documentación que puedo encontrar en ella sugiere su limitada a un java.nio.buffer. ¿Puedo obtener directamente los datos de píxeles usando esta función? Tal vez por obtener el buffer interno utilizado por la clase Bitmap?
¿Es mi única manera de usar esto para crear un Global Ref'd Java.nio.buffer entonces cada vez que quiero actualizar, copiar mis datos de píxeles en él y luego utilizar copyPixelsFromBuffer? Esto todavía implica 2 copias pero puede, por lo menos, eliminar el cambio del formato del pixel. ¿Esto va a ser más eficiente que el método que ya estoy usando?
¿Hay una manera aún mejor de hacerlo?
Por cierto, soy consciente del hecho de que puedo utilizar las funciones en <android / bitmap.h> pero realmente me gustaría no perder soporte para Android 2.1 y Android 2.2 …
Saludos por adelantado!
- Cómo convertir todo el contenido en una vista de desplazamiento a un mapa de bits?
- Necesito enviar un archivo de imagen al servidor de Clarifai para la clasificación de imágenes, pero sigo recibiendo "marcos omitidos, aplicación que hace demasiado trabajo"
- Android: creación de un mapa de bits con contenido de SurfaceView
- Escribir metadatos EXIF en imágenes en Android
- Bordes dentados en imágenes presentadas en Android
- Detección de colisiones Pixel-Perfect Android
- SetImageViewBitmap no funciona en el widget android
- Poner un mapa de bits en un paquete
Aquí viene una solución sucia pero funcional, trabajando desde Android 1.5 hasta 4.0. El código está en C ++.
//decls of some partial classes from Skia library class SkRefCnt{ public: virtual ~SkRefCnt(){} private: mutable int fRefCnt; }; //---------------------------- class SkPixelRef: public SkRefCnt{ public: virtual class Factory getFactory() const; virtual void flatten(class SkFlattenableWriteBuffer&) const; protected: virtual void* onLockPixels(class SkColorTable**) = 0; virtual void onUnlockPixels() = 0; public: void *GetPixels(){ SkColorTable *ct; return onLockPixels(&ct); } }; jobject java_bitmap; //your Bitmap object jclass java_bitmap_class = env.GetObjectClass(java_bitmap); class SkBitmap; SkBitmap *sk_bitmap = (SkBitmap*)env.CallIntMethod(java_bitmap, env.GetMethodID(java_bitmap_class, "ni", "()I")); SkPixelRef *sk_pix_ref; sk_pix_ref = (SkPixelRef*)((int*)sk_bitmap)[1]; // get pointer to Bitmap's pixel memory, and lenght of single line in bytes int buffer_pitch = env.CallIntMethod(java_bitmap, env.GetMethodID(java_bitmap_class, "getRowBytes", "()I")); void *buffer = sk_pix_ref->GetPixels();
AFAIK, método estático:
public static Bitmap createBitmap (int[] colors, int offset, int stride, int width, int height, Bitmap.Config config)
No implica copiar datos, sino que crea una estructura de mapa de bits (inmutable) sobre la matriz de píxeles existente. De esta manera puede preparar dicho mapa de bits de antemano y, a continuación, manipular el búfer de su código nativo. Esto soportará diferentes formatos de píxeles. El ejemplo de uso está disponible aquí:
(Línea 520)
- Hasta que el administrador de descargas de android le dé el estado de una descarga por referencia de descarga?
- No se pueden transmitir vídeos