Android中利用C++处理Bitmap对象
相信有些Android&图像算法开发者和我一样,遇到过这样的状况:要对Bitmap对象做一些密集计算(例如逐像素的滤波),但是在java层写循环代码来逐像素操作明显是不现实的,因为Java代码的运行速度太慢,而一副很小的240*320图像就有76800个像素,如果考虑到RGB三通道(或者ARGB四通道),还要对这个数量乘以3/4。因此对图像的密集计算一般都利用Jni接口,用C++实现。那么问题来了,怎么把Bitmap中的像素数据从Java层传到C++层?
做法1:之前的做法
我之前的做法是这样的,因为Bitmap类不支持直接获取像素数据,因此我利用copyPixelsToBuffer函数将像素数据复制到一块buffer中,再将buffer数据传到C++层中做处理,处理完成后,再使用copyPixelsFromBuffer函数将处理完的像素数据赋给Bitmap对象。这种方法的缺点是,需要额外申请一块几乎和当前图像等大的内存块作为buffer,还要增加两次额外的复制操作。本来我们利用C++处理像素的目的就是节省时间,现在额外的需求使得时间和空间复杂度都增加了,可见,这种方式并不经济实惠。
做法2:现在的做法
其实,Android的NDK可以在一定程度上处理从Java层传过来的Bitmap对象,可以将Bitmap对象传到C++层,直接获取其中的像素数据指针,做进一步处理。步骤如下:
a.编写JNI接口函数
//java接口函数
private static native int processBitmap(Bitmap bitmap);
//对应C++函数
JNIEXPORT jint JNICALL Java_com_example_test_nativeprocess_processBitmap
(JNIEnv *env, jclass,jobject bmpObj);
b.添加#include<android/bitmap.h>语句
#include<android/bitmap.h>
c.获取像素数据指针,进行操作
AndroidBitmapInfo bmpInfo={};
if(AndroidBitmap_getInfo(env,bmpObj,&bmpInfo)<)
{return -}
int* dataFromBmp=NULL;
if(AndroidBitmap_lockPixels(env,bmpObj,(void**)&dataFromBmp))
{return -;}
AndroidBitmap_lockPixels用来获取数据指针,数据指针的参数类型是(void**),因为Android中的Bitmap一般存放的是ARGB格式,如果需要的是像素,可以用int*指针,如果需要的是通道,可以用unsigned char*。
d.操作完毕,释放指针
AndroidBitmap_unlockPixels(env,bmpObj);
这样,不需要做任何复制操作,就可以直接操作Bitmap中的像素数据。
3.其他问题
如果需要在C++层创建Bitmap对象,再返回到Java层,这种需求我还没找到具体的实现方法,如果有人知道,请不吝指点
Android中利用C++处理Bitmap对象的更多相关文章
- Android中利用Handler实现消息的分发机制(三)
在第二篇文章<Android中利用Handler实现消息的分发机制(一)>中,我们讲到主线程的Looper是Android系统在启动App的时候,已经帮我们创建好了,而假设在子线程中须要去 ...
- Android中利用ant进行多渠道循环批量打包
公司负责Android开发的小伙伴学习能力稍微偏弱,交代给他的自动化打包的任务,弄了好久依然没有成效.无奈只好亲自出手. 没有想到过程很顺利,我完全按照如下文章的步骤进行: 主要参考: Android ...
- 《挑战30天C++入门极限》C++中利用构造函数与无名对象简化运算符重载函数
C++中利用构造函数与无名对象简化运算符重载函数 在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的: //程序作者:管宁 //站点:www.cn ...
- Android如何缓存你的BITMAP对象
在app中通常最占内存.占流量的元素就是图片了,图片往往又无处不在,特别是伴随着list,GridView或者ViewPager出现,这些图片随着你的滑动操作,时而出现在你的屏幕中,时而消失在屏幕之外 ...
- Android中利用jsoup解析html页面
学习jsoup :jsoup学习网站 Android 中使用: 添加依赖 implementation 'org.jsoup:jsoup:1.10.1' 直接上代码: package com.load ...
- Android中数据的传递以及对象序列化
Android中当两个Activity需要有信息交互的时候,可以使用Intent.具体来说: 发送单一类型数据: 发送方: String data = "Hello SecondActivi ...
- 【转】Android中如何使用Bundle传递对象[使用Serializable或者Parcelable] -- 不错
原文网址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1211/694.html Android中Bundle类的作用 Bun ...
- JAVA中利用反射机制进行对象和Map相互转换的方法
JAVA的反射机制主要作用是用来访问对象的属性.方法等等.所以,JAVA中对象和Map相互转换可以利用JAVA的反射机制来实现.例子如下: 一.对象转Map的方法 public static Map& ...
- Android中利用Camera与Matrix实现3D效果详解
本文行文目录: 一.Camera与Matrix初步认识 二.Camera与Matrix旋转效果拆分介绍 三.Camera与Matrix实现立体3D切换效果 [csdn地址:http://blog.cs ...
随机推荐
- phpstorm 调试 laravel
Reference: http://www.cnblogs.com/imayanlong/p/6375950.html, https://segmentfault.com/a/11900000045 ...
- 16款纯CSS3实现的loading加载动画
分享16款纯CSS3实现的loading加载动画.这是一款实用的可替代GIF格式图片的CSS3加载动画代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div clas ...
- 动态可视化 数据可视化之魅D3,Processing,pandas数据分析,科学计算包Numpy,可视化包Matplotlib,Matlab语言可视化的工作,Matlab没有指针和引用是个大问题
动态可视化 数据可视化之魅D3,Processing,pandas数据分析,科学计算包Numpy,可视化包Matplotlib,Matlab语言可视化的工作,Matlab没有指针和引用是个大问题 D3 ...
- 基于thinkphp的在线编辑器kindeditor-v4.1.3
首先,去官网下载最新版的kindeditor,然后把里面asp,jsp,net,example的全删除,然后改名为editor放进public(最外层目录的public)文件夹里面. 在目录lib目录 ...
- 解决MYSQL ERROR 1045 (28000)问题
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) Red Hat Enterpr ...
- 未能加载文件或程序集“System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项。系统找不到指定的文件。
问题:WPF未能加载文件或程序集"System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" ...
- python使用selenium
首先安装 pip install selenium 测试抓取baidu,其中的chromedriver.exe需要自己下载,百度有很多的 import timefrom selenium import ...
- MVC的JavaScriptResult使用
JavaScriptResult的使用有两个必要的前提: 1.Ajax 2.jquery.unobtrusive-ajax.js 使用代码示例 controller public ActionResu ...
- spring security笔记
当指定http元素的auto-config=”true”时,就相当于如下内容的简写. <security:http> <security:form-login/> <se ...
- springmvc搭建环境时报No mapping found for HTTP request with URI [/exam3/welcome] in DispatcherServlet with name 'spring2'
项目是使用spring MVC (1)在浏览器中访问,后台总报错: No mapping found for HTTP request with URI [/exam3/welcome] in Dis ...