Java的bitmap到C
在很多情况下android程序员需用到c,bimap这个是一个java中的类,android底层有一个skbitmap类和其对应。先在我遇到了需要把java的bitmap传递到底层中进行一些操作。现在我有两种方法:
方法一:
就是通过java把bitmap直接转换为数组,在通过jni数组的方式传递到底层中。
java部分:
public void putCBitmap(Bitmap bitmap)
{
int width = 1024;
int height = 600;
int[] pixels = new int[width*height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height); //把bitmap转换为int数组中
nativeSetBitmapC(pixels, width, height); //该函数为native函数
}
jni部分:
JNIEXPORT void Java_android_com_Mark_nativeSetBitmapC
(JNIEnv *env, jobject jobj, jintArray jarr, jint jwight, jint jheight) //把java的bitmap传递到底层,并进行显示
{
int *arr = env->GetIntArrayElements(jarr,NULL); //获取到java传递的数组
bitmap.setPixels((void*)arr); //将skbimap的像素设置为java传递下来的数组内容
memcpy(vaddr, bitmap.getPixels(), bitmap.getSize());
env->ReleaseIntArrayElements(jarr, arr, );
}
这个中方法就可以将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部分:
JNIEXPORT void JNICALL Java_android_com_Mark_nativeBitmapToC
(JNIEnv *env, jclass clazz, jobject bitmap)
{
AndroidBitmapInfo bmpInfo;
void* bmpPixels; if (AndroidBitmap_getInfo(env, bitmap, &bmpInfo) < ) {
LOGE("AndroidBitmap_getInfo() failed ! ");
return;
} /* LOGE("AndroidBitmapInfo:width = %d",bmpInfo.width);
LOGE("AndroidBitmapInfo:height = %d",bmpInfo.height);
LOGE("AndroidBitmapInfo:stride = %d",bmpInfo.stride);
LOGE("AndroidBitmapInfo:format = %d",bmpInfo.format); */ AndroidBitmap_lockPixels(env, bitmap, &bmpPixels);
memcpy(vaddr, bmpPixels, bmpInfo.stride*bmpInfo.height);
AndroidBitmap_unlockPixels(env, bitmap);
}
这样一样可以实现将java的bitmap直接传递到底层,这样速度很快。但是需要注意的是要在jni里面加入 #include <android/bitmap.h> 头文件。
还有就是Android.mk文件中记得加入LOCAL_LDFLAGS += -ljnigraphics 否则编译不过。
java如何把两个bitmap组合成一个bitmap。
public static Bitmap mergeBitmap(Bitmap backBitmap, Bitmap frontBitmap)
{
long start = System.currentTimeMillis();
Bitmap bitmap = backBitmap.copy(Config.ARGB_8888, true);
Canvas canvas = new Canvas(bitmap);
Rect baseRect = new Rect(0, 0, backBitmap.getWidth(), backBitmap.getHeight());
Rect frontRect = new Rect(0, 0, frontBitmap.getWidth(), frontBitmap.getHeight());
canvas.drawBitmap(frontBitmap, frontRect, baseRect, null);
long end = System.currentTimeMillis();
Log.e("WF->mergeBitmap = ", end - start+"ms");
return bitmap;
}
写博客是怕自己忘记,也希望能给后来的人一些帮助。有不对的地方欢迎指出。
Java的bitmap到C的更多相关文章
- java实现BitMap
package bitmap; public class BitMap { private byte[] bytes; public BitMap(byte[] bytes) { super(); t ...
- java使用bitmap求两个数组的交集
一般来说int代表一个数字,但是如果利用每一个位 ,则可以表示32个数字 ,在数据量极大的情况下可以显著的减轻内存的负担.我们就以int为例构造一个bitmap,并使用其来解决一个简单的问题:求两个数 ...
- 【算法与数据结构专场】BitMap算法基本操作代码实现
上篇我们讲了BitMap是如何对数据进行存储的,没看过的可以看一下[算法与数据结构专场]BitMap算法介绍 这篇我们来讲一下BitMap这个数据结构的代码实现. 回顾下数据的存储原理 一个二进制位对 ...
- Android笔记--Bitmap
Android | Bitmap解析 Android中Bitmap是对图像的一种抽象.通过他可以对相应的图像进行剪裁,旋转,压缩,缩放等操作.这里循序渐进的一步步了解Bitmap的相关内容. 先了解B ...
- Android图像处理之BitMap(2)
Bitmap 相关 1. Bitmap比较特别 因为其不可创建 而只能借助于BitmapFactory 而根据图像来源又可分以下几种情况: * png图片 如:R.drawable.tianjin J ...
- Android Bitmap变迁与原理解析(4.x-8.x)
App开发不可避免的要和图片打交道,由于其占用内存非常大,管理不当很容易导致内存不足,最后OOM,图片的背后其实是Bitmap,它是Android中最能吃内存的对象之一,也是很多OOM的元凶,不过,在 ...
- 图片系列(6)不同版本上 Bitmap 内存分配与回收原理对比
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...
- Android之三种网络请求解析数据(最佳案例)
AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...
- Android 保存图片到SQLite
[转:原文] Resources res = getResources(); Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ico ...
随机推荐
- Meteor.js异步全解
翻译来源: http://phucnguyen.info/blog/everything-you-need-to-know-about-async-meteor/ posted in Web Deve ...
- C语言对表达式的求值顺序不是明确规定的
讨论区看到的 WA来自那些递归下降求解的代码. 第一种情况,使用|| 和 &&: 例如s为所给串 int getval() { switch(s[c_s++]) { case 'p': ...
- hdu 6154 CaoHaha's staff
CaoHaha's staff Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 201621123010 《Java程序设计》第1周学习总结
1. 本周学习总结 本周主要学习了五个知识点 Java是面向对象的语言 JDK,JRE,JVM的联系 javac及java指令 Java跨平台运行的原理 新概念:类,类是面向对象中的概念 2. 书面作 ...
- New Concept English Two 28 76
$课文74 舞台之外 784. An ancient bus stopped by a dry river bed and a party of famous actors and actresse ...
- js中的reduce()函数
1. 首先看下语法如下 2 . 写了个demo如下 var fa = [1,2,3,4] function red(a, b) { console.log(arguments); return a + ...
- 在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作
在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作 MyEclipse6.5 , mysq驱动jar包为mysql-connector ...
- ubuntu 11.04 Gnome 恢复默认的任务栏面板
在Ubuntu(实际是GNOME) 中,桌面上默认的任务栏菜单面板是上下两栏,上面(Panel) 是系统菜单和通知区域下面是窗口存放切换区域,那么作为ubuntu用户来说,你总会使系统用起来更顺手更美 ...
- Python基础知识记录
1.去除空格 strip() 删除两边的空格.lstrip() 删除左边的空格.rstrip() 删除右边的空格 2.字符串的连接 s1='abc' s2='cdf' s3=s1+s2 pr ...
- BZOJ2118: 墨墨的等式(同余类BFS)(数学转为图论题)
2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2944 Solved: 1206[Submit][Status][Discu ...