图像处理 renderScript的使用 概述
2017-03-21 19:46
267 查看
最近看Android源码,发现安卓动态壁纸中水面落叶,是使用renderScript实现的,于是对RenderScript进行了下研究:
RenderScript的官方网址:
https://developer.android.com/guide/topics/renderscript/index.html
renderScript 文档简单翻译:
renderScript提供了一个平台无关的计算引擎,该引擎在native级别工作,可以使用它来对你需要大量运算的app进行加速。
它使用不同类型指令集与体系架构的计算单元组成系统进行运算,在处理计算机图像,视觉等方面尤其擅长,可以在设备所有可用处理器上并行执行,以使开发者不必关心调度与负载平衡的问题。
材料准备:
RenderScript的api从Android3.0(Api level 11)开始自带,在低于3.0的机器上,可以通过support包来使用RenderScript。
搭建过程:
在应用程序模块的应用程序文件夹打开build.gradle文件,
将一下设置添加上
运行结构图:
在确定可以使用renderScript api后,开始进行renderScript脚本的编写。
在app/src/main路径下新建一个文件夹,命名为/rs,如果你使用的AndroidStudio,导入工程会发现该文件夹名自动变成了/renderScript;在该文件夹下新建.rs文件,在该文档中编写rs脚本。.rs文件必须是应用程序包的一部分,而不是在库项目中。
renderScript脚本使用c99标准,是一种类C语言。
脚本结构如下:
#pragmaversion(1)//
声明此脚本中使用的RenderScript内核语言版本
#pragma rsjava_package_name(com.winomtech.androidmisc.rs)//声明本脚本反射出去的~ //Java文件的包名
void root(const uchar4 *in, uchar4 *out, uint32_t x,uint32_t y) {//kernel函数
}
void init() {//初始化函数,在root函数调用前会被调用一次,多用于变量初始化
}
一个rs脚本中可以有:
自定义变量:自动生成的ScriptC_XXX.java文件中生成所有非const变量的get和set方法
零个或多个可调用函数:单线程,可以在java代码中调用,经常用来较大处理管线中的初始化设置或并行计算
零个或多个计算内核,kernel函数,是一些可调用函数的集合或者可以用来在数据集合中并行执行的函数。有两种计算内核,不可调用
1 . Mappingkernel(foreach内核映射内核):对相同维度的集合进行操作的并行函数,默认情况下,对该维度想下的每个坐标执行一次,可用于一次性地将输入输出到一个element中去,在上例中,
void root(const uchar4 *in, uchar4 *out, uint32_t x,uint32_t y)的参数in,根据传递给内核的输入Allocation(数据集合,内存分配相关,我把它看做看做数据流)自动填充,内核处理完之后将返回值填充到out(输出用的Allocation)中对应位置。默认情况下,每个allocation中的元素都要执行一次kernel函数。Kernel函数可以有一个或多个输入,但只有一个输出。Kernel函数可以自定义名字,不过要加_
_attribute_ _((kernel)) 前缀作为标识具体见下文的例子。
2. Simplified kernel(简化内核)
RenderScript的官方网址:
https://developer.android.com/guide/topics/renderscript/index.html
renderScript 文档简单翻译:
renderScript提供了一个平台无关的计算引擎,该引擎在native级别工作,可以使用它来对你需要大量运算的app进行加速。
它使用不同类型指令集与体系架构的计算单元组成系统进行运算,在处理计算机图像,视觉等方面尤其擅长,可以在设备所有可用处理器上并行执行,以使开发者不必关心调度与负载平衡的问题。
材料准备:
RenderScript的api从Android3.0(Api level 11)开始自带,在低于3.0的机器上,可以通过support包来使用RenderScript。
搭建过程:
在应用程序模块的应用程序文件夹打开build.gradle文件,
将一下设置添加上
android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { minSdkVersion 9 targetSdkVersion 19 renderscriptTargetApi 18//指定要生成字节码版本 renderscriptSupportModeEnabled true//指定如果申城字节码运行设备不支持目标版本,则 ~ //会退到兼容版本 } }
运行结构图:
在确定可以使用renderScript api后,开始进行renderScript脚本的编写。
在app/src/main路径下新建一个文件夹,命名为/rs,如果你使用的AndroidStudio,导入工程会发现该文件夹名自动变成了/renderScript;在该文件夹下新建.rs文件,在该文档中编写rs脚本。.rs文件必须是应用程序包的一部分,而不是在库项目中。
renderScript脚本使用c99标准,是一种类C语言。
脚本结构如下:
#pragmaversion(1)//
声明此脚本中使用的RenderScript内核语言版本
#pragma rsjava_package_name(com.winomtech.androidmisc.rs)//声明本脚本反射出去的~ //Java文件的包名
void root(const uchar4 *in, uchar4 *out, uint32_t x,uint32_t y) {//kernel函数
}
void init() {//初始化函数,在root函数调用前会被调用一次,多用于变量初始化
}
一个rs脚本中可以有:
自定义变量:自动生成的ScriptC_XXX.java文件中生成所有非const变量的get和set方法
零个或多个可调用函数:单线程,可以在java代码中调用,经常用来较大处理管线中的初始化设置或并行计算
零个或多个计算内核,kernel函数,是一些可调用函数的集合或者可以用来在数据集合中并行执行的函数。有两种计算内核,不可调用
1 . Mappingkernel(foreach内核映射内核):对相同维度的集合进行操作的并行函数,默认情况下,对该维度想下的每个坐标执行一次,可用于一次性地将输入输出到一个element中去,在上例中,
void root(const uchar4 *in, uchar4 *out, uint32_t x,uint32_t y)的参数in,根据传递给内核的输入Allocation(数据集合,内存分配相关,我把它看做看做数据流)自动填充,内核处理完之后将返回值填充到out(输出用的Allocation)中对应位置。默认情况下,每个allocation中的元素都要执行一次kernel函数。Kernel函数可以有一个或多个输入,但只有一个输出。Kernel函数可以自定义名字,不过要加_
_attribute_ _((kernel)) 前缀作为标识具体见下文的例子。
2. Simplified kernel(简化内核)
相关文章推荐
- 图像模糊处理RenderScript
- 使用 Java 进行图像处理 - 图像缩放
- 使用 Java 进行图像处理 - 将彩色图像转换为灰度图
- 使用OpenGl GLSL进行数字图像处理
- 处理2D图像和纹理——使用层绘制透明图像
- 处理2D图像和纹理——使用SpriteBatch类显示2D图像:加载和绘制图像
- 最近在做的图形图像处理项目,使用GDI+(贴图)
- Delphi图像处理中ScanLine的使用
- 使用Jimi处理图像
- OpenCV学习笔记(8)VS2008 MFC下使用OpenCV2.0进行简单图像处理
- 图像处理经常使用的lena图的来历
- 使用 Java 进行图像处理 - 图像裁剪
- 使用 Java 进行图像处理 - 编码输出高分辨率图像
- 使用 Java 进行图像处理 - 编码输出高分辨率图像
- C#中使用lockbits方法处理图像(译文)
- 使用 Java 进行图像处理 - 取得图像上指定位置像素的 rgb 颜色分量
- 使用 Java 进行图像处理 - 图像编码输出
- [转]使用C#进行图像处理的几种方法
- 使用CImage类处理图像显示与格式转换(转)
- PIL---使用Python处理图像