zoukankan      html  css  js  c++  java
  • 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来完成速度会快很多。androiddevelopment dkplatformsandroid-8includeandroiditmap.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       }

      写博客是怕自己忘记,也希望能给后来的人一些帮助。有不对的地方欢迎指出。

      

  • 相关阅读:
    桥梁模式
    原型模式
    css backgroundposition
    eclipse配置了maven,项目报错
    SQL 练习题目
    Springmvc + Ibatis 搭建 点餐系统
    Delphi 性能优化工具
    Delphi的接口陷阱
    delphi 内存管理,定期释放
    Delphi制作数据感知控件之浮想联翩
  • 原文地址:https://www.cnblogs.com/winfu/p/6484293.html
Copyright © 2011-2022 走看看