Java的bitmap到C


  在很多情況下android程序員需用到c,bimap這個是一個java中的類,android底層有一個skbitmap類和其對應。先在我遇到了需要把java的bitmap傳遞到底層中進行一些操作。現在我有兩種方法:

方法一:

  就是通過java把bitmap直接轉換為數組,在通過jni數組的方式傳遞到底層中。

  java部分:

1 public void putCBitmap(Bitmap bitmap)
2     {
3     int width = 1024;
4     int height = 600;
5     int[] pixels = new int[width*height];
6         bitmap.getPixels(pixels, 0, width, 0, 0, width, height); //把bitmap轉換為int數組中
7         nativeSetBitmapC(pixels, width, height);  //該函數為native函數
8     }

  jni部分:

1 JNIEXPORT void Java_android_com_Mark_nativeSetBitmapC
2   (JNIEnv *env, jobject jobj, jintArray jarr, jint jwight, jint jheight) //把java的bitmap傳遞到底層,並進行顯示
3   {
4     int *arr = env->GetIntArrayElements(jarr,NULL); //獲取到java傳遞的數組
5     bitmap.setPixels((void*)arr); //將skbimap的像素設置為java傳遞下來的數組內容
6     memcpy(vaddr, bitmap.getPixels(), bitmap.getSize()); 
8     env->ReleaseIntArrayElements(jarr, arr, 0); 
9   }

  這個中方法就可以將java的bitma傳遞到底層的skbitmap中,但是如果頻繁如此操作就會降低效率。

方法二:

  使用android中自帶的bitmap.h來完成速度會快很多。android\development\ndk\platforms\android-8\include\android\bitmap.h 

  java代碼:

public static native void nativeBitmapToC(Bitmap bitmap);

  jni部分:

 

 1 JNIEXPORT void JNICALL Java_android_com_Mark_nativeBitmapToC
 2   (JNIEnv *env, jclass clazz, jobject bitmap)
 3   {
 4     AndroidBitmapInfo bmpInfo;
 5     void* bmpPixels;
 6     
 7     if (AndroidBitmap_getInfo(env, bitmap, &bmpInfo) < 0) {  
 8         LOGE("AndroidBitmap_getInfo() failed ! ");  
 9         return; 
10     }  
11 
12 /*     LOGE("AndroidBitmapInfo:width  = %d",bmpInfo.width);  
13     LOGE("AndroidBitmapInfo:height  = %d",bmpInfo.height);  
14     LOGE("AndroidBitmapInfo:stride  = %d",bmpInfo.stride);  
15     LOGE("AndroidBitmapInfo:format  = %d",bmpInfo.format);   */
16     
17     AndroidBitmap_lockPixels(env, bitmap, &bmpPixels);
18     memcpy(vaddr, bmpPixels, bmpInfo.stride*bmpInfo.height);
19     AndroidBitmap_unlockPixels(env, bitmap);  
20   }

  這樣一樣可以實現將java的bitmap直接傳遞到底層,這樣速度很快。但是需要注意的是要在jni里面加入 #include <android/bitmap.h> 頭文件。

  還有就是Android.mk文件中記得加入LOCAL_LDFLAGS += -ljnigraphics 否則編譯不過。

  java如何把兩個bitmap組合成一個bitmap。

 1 public static Bitmap mergeBitmap(Bitmap backBitmap, Bitmap frontBitmap)
 2      {
 3          long start = System.currentTimeMillis();
 4             Bitmap bitmap = backBitmap.copy(Config.ARGB_8888, true);
 5             Canvas canvas = new Canvas(bitmap);
 6             Rect baseRect  = new Rect(0, 0, backBitmap.getWidth(), backBitmap.getHeight());
 7             Rect frontRect = new Rect(0, 0, frontBitmap.getWidth(), frontBitmap.getHeight());
 8             canvas.drawBitmap(frontBitmap, frontRect, baseRect, null);
 9          long end = System.currentTimeMillis();   
10          Log.e("WF->mergeBitmap = ", end - start+"ms");
11             return bitmap;
12       }

  寫博客是怕自己忘記,也希望能給后來的人一些幫助。有不對的地方歡迎指出。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM