Renderscript 文档和建议 - Android
Renderscript Documentation and Advice - Android
我一直在关注如何在 Android 上使用渲染脚本的指南。
http://www.jayway.com/2014/02/11/renderscript-on-android-basics/
我的代码是这样的(我得到了脚本的包装器 class):
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) 这里convert_float4(in[0]).rgb;
rgb
return是什么意思?
3) 什么是 float3
?
4) 这行我不知道从哪里开始 out->xyz = convert_uchar3(pixel);
5) 我假设在参数中,in
和 out
分配是否已通过?
x
和 y
是什么?
1) 在内核中,in
指针是一个4元素的unsigned char,即表示一个像素颜色,R、G、B、A值在0-255范围内。所以 convert_float4
只是将四个 uchar
中的每一个都转换为 float
。在您使用的这个特定代码中,使用浮点数可能没有多大意义,因为您正在做一个简单的阈值,而且您也可以直接使用 uchar 数据。在执行需要额外精度的其他类型的图像处理算法时,使用浮点数更好(例如:模糊图像)。
2) .rgb
后缀是 shorthand 到 return 只有 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
,通过这样做,您只分配了该指针中的前三个 "rgb" 或 "xyz" 元素,第四个元素在这里未定义.
5) 是的,in
是输入像素,out
是输出像素。那么x
和y
就是像素点在整幅图像中的x、y坐标。对于您正在处理的 image/allocation 中的每个像素,将调用一次此内核函数,因此在处理图像时知道您所处的坐标通常是件好事。在这个特定的例子中,因为它只是以相同的方式对所有像素进行阈值处理,所以坐标是无关紧要的。
关于 RenderScript 的好的文档很难找到。不过,我强烈建议您看一下这两个视频,因为它们会让您更好地了解 RenderScript 的工作原理:
AnDevCon: A Deep Dive into RenderScript
Google I/O 2013 - High Performance Applications with RenderScript
请记住,这两个视频都有几年的历史了,因此最近的 API 上的一些小细节可能有所变化,但总的来说,这些可能是 RS 的最佳信息来源。
http://developer.android.com/guide/topics/renderscript/reference/rs_convert.html#android_rs:convert
这个convert_float4(in[0])是做什么的?
convert_float4 将从 uchar4 转换为 float4;
.rgb 将它变成前 3 个元素的 float3。
rgb是什么return?
RenderScript 矢量类型有 .r .g .b .a 或
.x .y .z .w 分别代表第一个、第二个、第三个和第四个元素。您可以使用任何组合(例如 .xy 或 .xwy)
什么是 float3?
float3 是一个 "vector type" 有点像浮点数,但有 3 个。
float 有 float2、float3 和 float4 向量类型。
(还有uchar4、int4等)
http://developer.android.com/guide/topics/renderscript/reference/overview.html 可能会有帮助
希望对您有所帮助。
我一直在关注如何在 Android 上使用渲染脚本的指南。
http://www.jayway.com/2014/02/11/renderscript-on-android-basics/
我的代码是这样的(我得到了脚本的包装器 class):
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) 这里convert_float4(in[0]).rgb;
rgb
return是什么意思?
3) 什么是 float3
?
4) 这行我不知道从哪里开始 out->xyz = convert_uchar3(pixel);
5) 我假设在参数中,in
和 out
分配是否已通过?
x
和 y
是什么?
1) 在内核中,in
指针是一个4元素的unsigned char,即表示一个像素颜色,R、G、B、A值在0-255范围内。所以 convert_float4
只是将四个 uchar
中的每一个都转换为 float
。在您使用的这个特定代码中,使用浮点数可能没有多大意义,因为您正在做一个简单的阈值,而且您也可以直接使用 uchar 数据。在执行需要额外精度的其他类型的图像处理算法时,使用浮点数更好(例如:模糊图像)。
2) .rgb
后缀是 shorthand 到 return 只有 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
,通过这样做,您只分配了该指针中的前三个 "rgb" 或 "xyz" 元素,第四个元素在这里未定义.
5) 是的,in
是输入像素,out
是输出像素。那么x
和y
就是像素点在整幅图像中的x、y坐标。对于您正在处理的 image/allocation 中的每个像素,将调用一次此内核函数,因此在处理图像时知道您所处的坐标通常是件好事。在这个特定的例子中,因为它只是以相同的方式对所有像素进行阈值处理,所以坐标是无关紧要的。
关于 RenderScript 的好的文档很难找到。不过,我强烈建议您看一下这两个视频,因为它们会让您更好地了解 RenderScript 的工作原理:
AnDevCon: A Deep Dive into RenderScript
Google I/O 2013 - High Performance Applications with RenderScript
请记住,这两个视频都有几年的历史了,因此最近的 API 上的一些小细节可能有所变化,但总的来说,这些可能是 RS 的最佳信息来源。
http://developer.android.com/guide/topics/renderscript/reference/rs_convert.html#android_rs:convert
这个convert_float4(in[0])是做什么的? convert_float4 将从 uchar4 转换为 float4; .rgb 将它变成前 3 个元素的 float3。
rgb是什么return? RenderScript 矢量类型有 .r .g .b .a 或 .x .y .z .w 分别代表第一个、第二个、第三个和第四个元素。您可以使用任何组合(例如 .xy 或 .xwy)
什么是 float3? float3 是一个 "vector type" 有点像浮点数,但有 3 个。 float 有 float2、float3 和 float4 向量类型。 (还有uchar4、int4等)
http://developer.android.com/guide/topics/renderscript/reference/overview.html 可能会有帮助
希望对您有所帮助。