参考
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();