我一直在关注如何在Android上使用渲染脚本。
http://www.jayway.com/2014/02/11/renderscript-on-android-basics/
我的代码就是这个(我有一个脚本的包装类):
public class PixelCalcScriptWrapper {
private Allocation inAllocation;
private Allocation outAllocation;
RenderScript rs;
ScriptC_pixelsCalc script;
public PixelCalcScriptWrapper(Context context){
rs = RenderScript.create(context);
script = new ScriptC_pixelsCalc(rs, context.getResources(), R.raw.pixelscalc);
};
public void setInAllocation(Bitmap bmp){
inAllocation = Allocation.createFromBitmap(rs,bmp);
};
public void setOutAllocation(Bitmap bmp){
outAllocation = Allocation.createFromBitmap(rs,bmp);
};
public void forEach_root(){
script.forEach_root(inAllocation, outAllocation);
}
}
此方法调用脚本:
public Bitmap processBmp(Bitmap bmp, Bitmap bmpCopy) {
pixelCalcScriptWrapper.setInAllocation(bmp);
pixelCalcScriptWrapper.setOutAllocation(bmpCopy);
pixelCalcScriptWrapper.forEach_root();
return bmpCopy;
};
这是我的剧本:
#pragma version(1)
#pragma rs java_package_name(test.foo)
void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
float3 pixel = convert_float4(in[0]).rgb;
if(pixel.z < 128) {
pixel.z = 0;
}else{
pixel.z = 255;
}
if(pixel.y < 128) {
pixel.y = 0;
}else{
pixel.y = 255;
}
if(pixel.x < 128) {
pixel.x = 0;
}else{
pixel.x = 255;
}
out->xyz = convert_uchar3(pixel);
}
现在我在哪里可以找到关于此的文档?
例如,我有这些问题:
1)这个convert_float4(in[0])
做了什么?
2)rgb
返回convert_float4(in[0]).rgb;
的内容是什么?
3)什么是float3
?
4)我不知道从哪一行out->xyz = convert_uchar3(pixel);
5)我在参数中假设in
和out
是否已通过分配?
什么是x
和y
?
答案 0 :(得分:3)
http://developer.android.com/guide/topics/renderscript/reference/rs_convert.html#android_rs:convert
这个convert_float4(在[0]中)做了什么? convert_float4将从uchar4转换为float4; .rgb将其转换为前3个元素的float3。
rgb会返回什么? RenderScript矢量类型具有.r .g .b .a或 .x .y .z .w分别代表第一,第二,第三和第四个元素。您可以使用任何组合(例如.xy或.xwy)
什么是float3? float3是一个&#34;矢量类型&#34;有点像浮子,但有3个。 浮点数有float2,float3和float4向量类型。 (有uchar4,int4等。)
http://developer.android.com/guide/topics/renderscript/reference/overview.html可能会有所帮助
我希望这会有所帮助。
答案 1 :(得分:2)
1)在内核中,in
指针是一个4元素无符号字符,也就是说,它表示一个像素颜色,其中R,G,B和A值在0-255范围内。因此,convert_float4
只会将四个uchar
中的每一个投射为float
。在你正在使用的这个特定代码中,使用浮点数可能没什么意义,因为你正在做一个简单的阈值,你也可以直接使用uchar数据。在进行其他类型的图像处理算法时,使用浮点数更有针对性,您需要具备额外的精度(例如:模糊图像)。
2).rgb
后缀是仅返回float4
的前三个值的简写,即R,G和B值。如果您仅使用.r
,那么它会为您提供常规float
的第一个值,如果您使用了.g
,它会将第二个值作为float
,等等......然后将这三个值分配给float3
变量,该变量现在代表只有三个颜色通道的像素(即没有A alpha通道)。
3)见#2。
4)现在convert_uchar3
又是另一个将float3
像素变量转换回uchar3
变量的转换。您将按顺序为每个x,y和z元素分配三个值。这可能是提及X,Y和Z与R,G和B完全可互换的好时机。该语句也可以使用out->rgb
,它实际上更具可读性。请注意,out
是uchar4
,通过这样做,您只分配前三个&#34; rgb&#34;或&#34; xyz&#34;在该指针中的元素,第四个元素在此处未定义。
5)是的,in
是输入像素,out
是输出像素。然后x
和y
是整个图像中像素的x和y坐标。对于您正在使用的图像/分配中的每个像素,将调用此内核函数一次,因此通常很好地了解您在处理图像时所处的坐标。在这个特定的例子中,因为它只是以相同的方式对所有像素进行阈值处理,所以坐标是无关紧要的。
很难找到有关RenderScript的良好文档。我强烈建议您先看一下这两个视频,因为它们可以让您更好地了解RenderScript的工作原理:
AnDevCon: A Deep Dive into RenderScript
Google I/O 2013 - High Performance Applications with RenderScript
请注意,这两个视频都有几年的历史,因此最近的API可能会更改一些细微的细节,但总的来说,这些可能是RS的最佳信息来源。