我清楚地看到有必要加深我对RenderScript内存分配和数据类型的了解(我仍然对数据类型的数量庞大并且在任何一方找到正确的相应类型 - 分配和元素感到困惑。(或者何时到请参阅forEach输入,输出或两者等。)因此,我将阅读并重新阅读文档,这真的不错 - 但它需要一些时间来获得必要的“直觉”如何正确使用它。但是现在,请帮我解决这个基本问题(我稍后会回答希望不那么愚蠢的问题......)。我需要一个非常简单的内核,它采用ARGB颜色位图并返回一个灰度值的整数数组。尝试如下:
#pragma version(1)
#pragma rs java_package_name(com.example.xxxx)
#pragma rs_fp_relaxed
uint __attribute__((kernel)) grauInt(uchar4 in) {
uint gr= (uint) (0.2125*in.r + 0.7154*in.g + 0.0721*in.b);
return gr;
}
和Java方面:
int[] data1 = new int[width*height];
ScriptC_gray graysc;
graysc=new ScriptC_gray(rs);
Type.Builder TypeOut = new Type.Builder(rs, Element.U8(rs));
TypeOut.setX(width).setY(height);
Allocation outAlloc = Allocation.createTyped(rs, TypeOut.create());
Allocation inAlloc = Allocation.createFromBitmap(rs, bmpfoto1,
Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
graysc.forEach_grauInt(inAlloc, outAlloc);
outAlloc.copyTo(data1);
此消息与消息无法找到符号“convert_uint”。这次转换有什么问题?代码是否正确?
更新:这不是很荒谬吗?即使经过2个小时的尝试,我也没有得到这个“简单的”运行。我仍然在使用不同的元素和变量类型。让我们回顾一下:输入是一个位图。输出是一个int []数组。那么,当我在Java端Out-allocation中使用U8,在Java端分配时使用createFromBitmap,uchar4作为内核输入和uint作为内核输出(RSRuntimeException:类型与U32不匹配)时,为什么它不起作用?
答案 0 :(得分:2)
没有convert_uint()
功能。简单铸造怎么样?除此之外,代码看起来还不错(假设width
和height
具有正确的值)。
更新:我刚刚注意到你分配了Element.I32
(即有符号整数类型),但是从内核返回uint
。这些应该匹配。在任何情况下,除非您需要超过8位的精度,否则您应该能够将结果放在U8中。
更新:如果要更改输出类型,请确保在所有位置更改输出类型,例如如果内核返回uint
,则分配应使用U32
。如果内核返回char
,则分配应使用I8
。等等...
答案 1 :(得分:1)
您不能直接使用Uint [],因为输入的Bitmap实际上是2维的。你能用适当的宽度/高度创建输出分配并试试吗?完成后,您仍然可以将值提取到Java数组中。