下面通过一个例子深入了解renderScript的工作过程:

用renderScript实现图片的反色效果:

反色效果又叫底片效果,首先要知道什么是反色:

反色又叫补色,红的补色是绿色,蓝的补色是橙色,黄的补色是紫色,由这三种对比关系可引出很多对比的反色。   例如黑与白、红与绿等。   反色是与原色叠加可以变为白色的颜色,即用白色(RGB:255,255,255)去原色的颜色。比如说红色(RGB:255,0,0)的反色是绿色(0,255,255)。

那么可以推想出反色效果的计算方法,即对图片中的每一个像素颜色用255来减,然后给该像素点颜色重新赋值,得到的新图片既是取反色的目标图片。

由于图片的颜色有三个分量,即RGB,于是假设像素点为cur,那么取反色公式为:

Cur.r=255-Cur.r;

Cur.g=255-Cur.g;

Cur.b=255-Cur.b

在这个实例中,renderScript的方便之处在于为我们提供了获取每个像素点的方法。

编写rs脚本:

在app/src/main/文件夹下新建/rs文件夹,在里面新建一个.rs后缀的文件。

Rs文件基本语法与c语言类似,主要处理函数为kernel函数:

#pragma version(1)
#pragma rsjava_package_name(cn.dream.mao.magnifier)

// 存储输入的Allocation,也就是存放原始图片的地方
rs_allocation inputAllocation;

uchar4__attribute__((kernel)) magnify(uchar4 in, int x, int y) {//自定义的 ~                                                                                                      //kernel函数

//参数in自~动填充,不过这里我们不用。

uchar4 cur= rsGetElementAt_uchar4(inputAllocation,x, y);//从原始图片   ~                                                                // 取出当前正在进行计算的像素点。

cur.r=255-cur.r;
    cur.g=255-cur.g;//反色效果,底片效果
  
cur.b=255-cur.b;

return cur;//返回输入图像的指定位置的像素点
}
void init(){//初始化函数,在调用kernel函数前调用一次,这里没什么好   ~                 //初始化的,为空
}

简单几行代码,计算核心算法已经完成了,接下来的工作就是明确怎样从java输入一张图片到inputAllocation中,以及kernel计算核心处理过的数据怎么输出到java层去。

如果rs脚本文件编写没有语法错误通过编译,点击AndroidStudio的rebuildProject,执行完毕后,会自动在/app/build/generated/source/rs/debug/..你的包名../下生成ScriptC__XX.java文件,XX就是rs脚本的文件名,

这个文件里生成了rs脚本中定义的变量的get和set方法,以及rs脚本中一些可调用方法的invoke方法,比如如果我在rs脚本中声明了一个

Void ok(){}方法 ,对应的ScriptC_XX文件中就会有一个

Public void invoke_ok(){

Invoke(mExportFuncIdx_ok);

}

,方便调用,invoke是renderScript API提供的方法。

一般的,我们编写一个辅助类XXRS.java,通过这个工具操作rs脚本。

在本例中,命名为MagnifierRS.java,以下是源码:

import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.renderscript.Allocation;
import android.renderscript.RenderScriptGL;
import android.widget.ImageView;import cn.dream.mao.rstest.R;/*** Created by mao on 17-3-14.*/
public class MagnifierRS {RenderScriptGL renderScriptGL;//renderScript api提供,输出脚本的结 ~                                                        // 果ScriptC_magnifier scriptC_magnifier;//自动生成的java类;private Allocation inputAllocation;//输入allocation,数据是原始图片private Allocation outputAllocation;//输出allocationprivate Bitmap sourceBitmap;//原始图片private Bitmap destBitmap;//生成后的图片public MagnifierRS(RenderScriptGL renderScriptGL, Resources resources) {//工具类的初始化方法,用于绑定rs脚本等操作this.renderScriptGL = renderScriptGL;//用的时候直接new一个就可以scriptC_magnifier = new ScriptC_magnifier(renderScriptGL, resources, R.raw.magnifier);//R.raw.magnifier就是脚本文件,读取脚本需要resource,~                           //activity等可以直接getResources()获得。this.renderScriptGL.bindRootScript(scriptC_magnifier);sourceBitmap = BitmapFactory.decodeResource(resources, R.drawable.scene);destBitmap = Bitmap.createBitmap(sourceBitmap.getWidth(), sourceBitmap.getHeight(), Bitmap.Config.ARGB_8888);inputAllocation = Allocation.createFromBitmap(this.renderScriptGL, sourceBitmap);//将图片输入到输入Allocation中scriptC_magnifier.set_inputAllocation(inputAllocation);//将输入数据传递给脚本
        outputAllocation = Allocation.createFromBitmap(this.renderScriptGL, destBitmap);//设置输出到outputAllocation中}/*** 提供给activity等组件使用的方法,直接将转换后的图片设置给imageView** @param imageView*/public void setMagniferImage(ImageView imageView) {scriptC_magnifier.forEach_magnify(inputAllocation, outputAllocation);//调用kernel方法// l.e("输出到dest!");outputAllocation.copyTo(destBitmap);//将输出Allocation的数据复制到bitmap中// l.e("添加iv!");imageView.setImageBitmap(destBitmap);}
}

如此,处理图片的核心算法与调用方式就完成了,工具类对外提供了一个可调用方法setMagniferImage() 将一个imageView传入,就可以将R.drawable.scene图片取反色输出到该imageView,输入图片当然根据需要可以动态选择,输出也可以根据需要保存在本地或者输出到其他什么地方,这里这样写只是最简单的写法。

 

renderScript实现图片反色效果实例相关推荐

  1. canvas 图片反色

    代码实例: <!DOCTYPE HTML> <html> <head><meta charset="utf-8"><title ...

  2. c#图像处理、图片拼接、图片裁剪、图片缩放、图上添加形状、屏幕截图、图片反色、改变图片色彩度全解

    全栈工程师开发手册 (作者:栾鹏) c#教程全解 using System; using System.Collections.Generic; using System.ComponentModel ...

  3. jquery仿凡客诚品图片切换的效果实例代码

    清远大学城网(http://www.qydxc.com) 是一个不错的图片切换效果,就是可以图片带文字说明的折叠效果,下面我来给大家推荐两个版本的效果,有需要了解的朋友可参考. 图片版的效果代码如下复 ...

  4. 原生js+css实现带预览图片的幻灯片效果实例

    先总结一下,里面的用到的关键知识点 CSS中用到的知识点有: 过渡效果:transition,下面是语法,用到时候一般要加上浏览器内核前缀.本实例中主要用到过渡的地方是opacity和right tr ...

  5. opencv彩色三通道图片反色(3)

    这是标准mnist格式转换成的图片,肉眼看以为是单通道的灰度图,然后直接dst=255-src或者bitwise_xor,转换出来的图片不能打开.最后用imagewatch发现是三通道的.. 原始图片 ...

  6. Intel Realsense D435 C/C++调用code examples(附代码)(坑坑坑坑坑!!!)(opencv显示图片反色解决)

    https://dev.intelrealsense.com/docs/rs-hello-realsense

  7. java实现图片反色

  8. C#,图片分层(Layer Bitmap)绘制,反色、高斯模糊及凹凸贴图等处理的高速算法与源程序

    图像反色Invert 对图像处理的过程中会遇到一些场景需要将图片反色,反色就是取像素的互补色,比如当前像素是0X00FFFF,对其取反色就是0XFFFFFF – 0X00FFFF = 0XFF0000 ...

  9. html图标反色,Html5 反色 及其 透明 效果

    PaoPaoGame var context = null; var image = null; function loadImage() { var main = document.getEleme ...

最新文章

  1. WEB站点使用企业库安全性异常解决办法
  2. python更新pip失败-新手求助, python 升级 pip 失败
  3. IOS的UI基础02
  4. mysql 导入 相对路径,MySQL数据库导出与导入及常见错误解决
  5. lintcode 418整数转罗马数字
  6. 跟几个程序员聊了聊他们的每月薪资收入
  7. leetcode367. 有效的完全平方数
  8. C++总结篇(2)类和对象
  9. ADO.NET数据库编程
  10. dao层如何调用对象_如何实现DBCP数据库连接池工具类&mvc分层开发web流程操作?...
  11. 主管都在用项目管理Excel表格模板管理项目
  12. 使用 reduce 函数计算阶乘
  13. 使用迅雷下载百度云盘数据
  14. 2017年 第八届蓝桥杯 Java B组真题整理
  15. 你目前在用的 RSS 服务还满意吗,赶紧进来手把手教你自建一个私有的 RSS 服务器!...
  16. bzoj1605 / P2905 [USACO08OPEN]农场危机Crisis on the Farm
  17. Java验证代理ip是否成功
  18. python 64式: 第24式、python项目国际化翻译实战
  19. 利用opencv带你玩转人脸识别-下篇(人脸录入,数据训练,人脸识别小案例快速入门)
  20. ES6给对象部署Iterator

热门文章

  1. 什么是DC,以及CreateCompatibleDC,CreateCompatibleBitmap,SelectObject的作用
  2. CreateCompatibleDC工作原理
  3. 安卓5.0开发环境的搭建
  4. 应用向左,理论向右,计算机2021的冰火两重天
  5. FFmpeg命令行(ffmpeg、ffplay、ffprobe)
  6. 网页设计基础教程(1) PS篇
  7. 数据结构课程设计【C++实现】
  8. linux命令之pip命令
  9. laravel学习1.0
  10. OCT-模拟集成电路设计的九个境界