为什么我在 android 中的 rendescript 根本不起作用?
Why is my rendescript in android not working at all?
这是我的 build.gradle
文件
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion '22.0.1'
defaultConfig {
applicationId "com.apps.foo.pointop"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
renderscriptTargetApi 19
renderscriptSupportModeEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
}
我也有几个 classes:
每当有来自相机的新帧时调用(这意味着很多次!)
@Override
public void onCleanPreviewBitmapUpdated(Bitmap origBmp) {
if(processedPreviewFragment != null) {
processedPreviewFragment.setImageViewBitmap(
bProcessor.processBitmap(origBmp)
);
}
}
现在我的 bProcessor
class 这样做:
public Bitmap processBitmap(Bitmap origBmp) {
return edgeDetection.apply(origBmp);
}
很简单。
我的 edgeDetection
class 有这个:
package com.apps.foo.pointop;
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v8.renderscript.*;
public class EdgeDetection {
private Allocation inAllocation;
private Allocation outAllocation;
private RenderScript mRS = null;
private ScriptC_edgedetect mScript = null;
public EdgeDetection(Context ctx) {
mRS = RenderScript.create(ctx);
mScript = new ScriptC_edgedetect(mRS, ctx.getResources(), R.raw.edgedetect);
}
public Bitmap apply(Bitmap origBmp) {
Bitmap bmpCopy = origBmp.copy(origBmp.getConfig(), true); // is this needed?
inAllocation = Allocation.createFromBitmap(mRS, origBmp);
outAllocation = Allocation.createFromBitmap(mRS, bmpCopy);
mScript.forEach_root(inAllocation,outAllocation);
return bmpCopy;
}
}
最后,我的 RenderScript 代码是这样的(它 不 进行边缘检测,我现在只是在尝试平均图像):
#pragma version(1)
#pragma rs java_package_name(com.apps.foo.pointop)
uchar4 RS_KERNEL root(uchar4 in, uint32_t x, uint32_t y) {
uchar4 out = in;
float3 pixel = convert_float4(in).rgb;
pixel.r = (pixel.r + pixel.g + pixel.b)/3;
pixel.g = (pixel.r + pixel.g + pixel.b)/3;
pixel.b = (pixel.r + pixel.g + pixel.b)/3;
out.xyz = convert_uchar3(pixel);
return out;
}
现在当我执行 运行 代码时,没有任何改变....我什至比较了新的位图,它与原始位图完全相同。为什么我的 renderscript 运行ning 但没有应用任何更改?
我正在三星 S4 mini 上测试这个,运行ning KitKat 4.4.4。
在 forEach 之后,您需要做:
outAllocation.copyTo(bmpCopy);
否则,您实际上并没有复制回 forEach 操作的分配结果。位图分配通常隐式声明 USAGE_SHARED,但这仍然需要使用 copyTo(),这可能只是一个空操作。
这是我的 build.gradle
文件
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion '22.0.1'
defaultConfig {
applicationId "com.apps.foo.pointop"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
renderscriptTargetApi 19
renderscriptSupportModeEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
}
我也有几个 classes:
每当有来自相机的新帧时调用(这意味着很多次!)
@Override
public void onCleanPreviewBitmapUpdated(Bitmap origBmp) {
if(processedPreviewFragment != null) {
processedPreviewFragment.setImageViewBitmap(
bProcessor.processBitmap(origBmp)
);
}
}
现在我的 bProcessor
class 这样做:
public Bitmap processBitmap(Bitmap origBmp) {
return edgeDetection.apply(origBmp);
}
很简单。
我的 edgeDetection
class 有这个:
package com.apps.foo.pointop;
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v8.renderscript.*;
public class EdgeDetection {
private Allocation inAllocation;
private Allocation outAllocation;
private RenderScript mRS = null;
private ScriptC_edgedetect mScript = null;
public EdgeDetection(Context ctx) {
mRS = RenderScript.create(ctx);
mScript = new ScriptC_edgedetect(mRS, ctx.getResources(), R.raw.edgedetect);
}
public Bitmap apply(Bitmap origBmp) {
Bitmap bmpCopy = origBmp.copy(origBmp.getConfig(), true); // is this needed?
inAllocation = Allocation.createFromBitmap(mRS, origBmp);
outAllocation = Allocation.createFromBitmap(mRS, bmpCopy);
mScript.forEach_root(inAllocation,outAllocation);
return bmpCopy;
}
}
最后,我的 RenderScript 代码是这样的(它 不 进行边缘检测,我现在只是在尝试平均图像):
#pragma version(1)
#pragma rs java_package_name(com.apps.foo.pointop)
uchar4 RS_KERNEL root(uchar4 in, uint32_t x, uint32_t y) {
uchar4 out = in;
float3 pixel = convert_float4(in).rgb;
pixel.r = (pixel.r + pixel.g + pixel.b)/3;
pixel.g = (pixel.r + pixel.g + pixel.b)/3;
pixel.b = (pixel.r + pixel.g + pixel.b)/3;
out.xyz = convert_uchar3(pixel);
return out;
}
现在当我执行 运行 代码时,没有任何改变....我什至比较了新的位图,它与原始位图完全相同。为什么我的 renderscript 运行ning 但没有应用任何更改?
我正在三星 S4 mini 上测试这个,运行ning KitKat 4.4.4。
在 forEach 之后,您需要做:
outAllocation.copyTo(bmpCopy);
否则,您实际上并没有复制回 forEach 操作的分配结果。位图分配通常隐式声明 USAGE_SHARED,但这仍然需要使用 copyTo(),这可能只是一个空操作。