我使用renderscript,当我编写内核时,起初它表现正常。但是当我更改内核并重建项目时,它什么也没有返回。谁知道为什么?它只返回一张空白的照片,而不是别的。
答案 0 :(得分:1)
我修好了。对我来说问题是targetSdkVersion 24。我发现在android 7中,renderscript有很多变化(NEW FEATURES),所以我把它改成了targetSdkVersion 22并修复了这个问题。我试着做一个简单的过滤器,使用过滤器后它在imageview中没有显示任何内容。但当我将targetSdkVersion更改为22时,它修复了问题,我可以在imageview中看到过滤后的图像。这是我用过的代码:
uchar4 __attribute__((kernel)) filtered(uchar4 in, uint32_t x, uint32_t y) {
uchar4 out = in;
out.r = 255 - in.r;
out.g = 255 - in.g;
out.b = 255 - in.b;
return out;
}
如果您感兴趣,可以使用targetSdkVersion 24和22进行尝试。这里是java部分的代码:
public void imageFilter(Bitmap bmp) {
doAllocation();
operationBitmap = Bitmap.createBitmap(bmp.getWidth(),
bmp.getHeight(), bmp.getConfig());
int height = operationBitmap.getHeight();
int width = operationBitmap.getWidth();
Toast.makeText(MainActivity.this, width + " x " + height, Toast.LENGTH_SHORT).show();
ScriptC_cnn cnnScript = new ScriptC_cnn(rs);
cnnScript.forEach_filtered(allocIn, allocOut);
allocOut.copyTo(operationBitmap);
selectedImagePreview.setImageBitmap(operationBitmap);
rs.destroy();
}
public void doAllocation() {
allocIn = Allocation.createFromBitmap(rs, originalBitmap,
Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
allocOut = Allocation.createTyped(rs,
allocIn.getType());
}
你可以在developer.android网站上看到谷歌的续订文件。链接在这里: https://developer.android.com/guide/topics/renderscript/compute.html#writing-an-rs-kernel
您可以看到,对于映射内核,您可以使用RS_KERNEL而不是属性((内核))。谷歌提到RS_KERNEL是一个由RenderScript自动定义的宏,方便您使用:
#define RS_KERNEL __attribute__((kernel))
<强>更新强> 这是我的傻瓜:
android {
compileSdkVersion 24
buildToolsVersion "24.0.1"
defaultConfig {
applicationId "shahryar.com.cellularneuralnetwork"
minSdkVersion 16
targetSdkVersion 22
versionCode 1
versionName "1.0"
renderscriptSupportModeEnabled true;
renderscriptTargetApi 16;
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.0'
}
我在google的文档中根据此行使用了renderscriptTargetApi 16:此设置的有效值是从11到最近发布的API级别的任何整数值。如果应用程序清单中指定的最低SDK版本设置为其他值,则忽略该值,并使用构建文件中的目标值设置最低SDK版本。
注意:这是我现在正在使用的gradle版本。