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).

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!

2 Solutions collect form web for “Rellenar los datos en un mapa de bits de Android tan pronto como sea posible desde C”

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í:

http://javaocr.svn.sourceforge.net/viewvc/javaocr/trunk/demos/recognizer/src/net/sf/javaocr/demos/android/recognizer/Recognizer.java?revision=239&view=markup

(Línea 520)

  • Dibujo fuera de pantalla WebView a mapa de bits
  • Convertir un lienzo en imagen de mapa de bits en android
  • Recortar parte particular de la imagen en android
  • La compresión de mapa de bits de Android no es buena
  • Aplicación lenta con imagen de fondo
  • Java Android - volley library - obtener un mapa de bits a través de ImageLoader
  • Cómo guardar bitmap de GLSurfaceView (Sólo bitmap, no toda la textura)
  • android convertir mapa de bits a bufferedinputstream
  • GetDrawingCache () devuelto Bitmap no actualizado
  • Spritesheet programa de corte: las mejores prácticas
  • Obtener información de mapa de bits de mapa de bits almacenado en carpeta dibujable
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.