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!

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)

  • Configuración de varios elementos personalizados en MultiAutoCompleteTextView: Android
  • Bitmap, Bitmap.recycle (), WeakReferences y Garbage Collection
  • Imagen de la cámara a Bitmap resultados en desordenado imagen
  • Vista de la imagen de la escala de submuestreo - haga clic en los marcadores de pin en Imageview
  • ¿Por qué dibujar bitmaps es muy lento en algunos teléfonos Android 2.2?
  • Obtener imagen uri de picasso?
  • Lona de Android a mapa de bits
  • Canvas Cambia dinámicamente el índice z de un mapa de bits
  • Ajuste automático de brillo, contraste y nitidez de una imagen de mapa de bits
  • Escala de mapa de bits a 80 por ciento
  • decodeStream devuelve null
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.