Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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!

  • Obtención de mapa de bits desde SurfaceView personalizado
  • Tratando de dibujar en un mapa de bits cargado por el usuario
  • ¿Qué hacen setDither, setFilterBitmap y setAntiAlias ​​en una lona?
  • Dando dibujo / Pintura / Ahorro de múltiples mapas de bits
  • ¿Por qué estoy recibiendo java.io.IOException: Mark ha sido invalidado?
  • Centro de recorte de Android de mapa de bits
  • Cargar un recurso a un mapa de bits mutable
  • Evitar que el bitmap sea un android reciclado
  • 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)

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.