Android 使用RenderScript

版权声明:本文为匆忙拥挤repeat(stone)原创文章,转载请注明出处 —— http://blog.csdn.net/jjwwmlp456 https://blog.csdn.net/jjwwmlp456/article/details/84103497

参考

官方文档


gradle 配置

build.gradle:

android {
	defaultConfig {
		//renderscript 兼容配置; 
        renderscriptTargetApi 14
        renderscriptSupportModeEnabled  true
	}
}
...
dependencies {
    //implementation com.android.support:appcompat-v7:28.0.0' //support
	implementation 'androidx.appcompat:appcompat:1.0.2' //androidx
}

混淆:

#-dontwarn android.support.v8.renderscript.**
#-keep public class android.support.v8.renderscript.** { *; }
-dontwarn androidx.renderscript.**
-keep public class androidx.renderscript.** { *; }

使用java 代码进行图像模糊

mImageView.buildDrawingCache();
Bitmap bitmap = mImageView.getDrawingCache();

RenderScript rs = RenderScript.create(this);
Allocation overlayAlloc = Allocation.createFromBitmap(rs, bitmap);
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, overlayAlloc.getElement());
blur.setInput(overlayAlloc);
blur.setRadius(mRadius);
blur.forEach(overlayAlloc);

Bitmap overlay = Bitmap.createBitmap(mImageView.getWidth(),
        mImageView.getHeight(), Bitmap.Config.ARGB_8888);
overlayAlloc.copyTo(overlay);

mImageView.setImageBitmap(overlay);

mImageView.destroyDrawingCache();

Allocation 用于分配内存对象;
ScriptIntrinsicBlur 系统提供的, 图像模糊的脚本类;
blur.setRadius(mRadius); 该模糊角度的在[0, 25];

系统还提供了一些其它的脚本类,它们都是ScriptIntrinsic类的子类,ScriptIntrinsicBlur 也是。


使用rs 脚本进行图像颜色反转

src/main/rs下,创建 ".rs"结尾的脚本文件 reverse_color.rs:

#pragma version(1)
#pragma rs java_package_name(com.stone.gradle1)
uchar4 __attribute__((kernel)) invert(uchar4 in)
{
  uchar4 out = in;
  out.r =255- in.r;
  out.g = 255-in.g;
  out.b = 255-in.b;
  return out;

}
//每个rs文件编译后都会自动生成对应的Java代码   ScriptC_reverse_color.java 类
//java_package_name java 代码生成在哪个包下
//__attribute__ 用于声明这个函数是个RenderScript核心函数,而不是一个可调用的函数,
// 这个函数不是个普通函数,是用于并行计算的函数。我们不能显式调用,它是RenderScript内部调用的函数

接着在 java 代码使用:

mImageView.buildDrawingCache();
Bitmap bitmap = mImageView.getDrawingCache();
Bitmap outBitmap = Bitmap.createBitmap(mImageView.getWidth(), mImageView.getHeight(), Bitmap.Config.ARGB_8888);

RenderScript rs = RenderScript.create(this);
ScriptC_reverse_color script = new ScriptC_reverse_color(rs);

Allocation allocIn = Allocation.createFromBitmap(rs, bitmap);
Allocation allocOut = Allocation.createFromBitmap(rs, outBitmap);

script.forEach_invert(allocIn, allocOut);

allocOut.copyTo(outBitmap);

mImageView.setImageBitmap(outBitmap);

mImageView.destroyDrawingCache();

猜你喜欢

转载自blog.csdn.net/jjwwmlp456/article/details/84103497