Renderscript文档和建议-Android
关于如何在Android上使用渲染脚本,我一直遵循此指南 我的代码如下(我为脚本获得了一个包装器类): 此方法调用脚本:Renderscript文档和建议-Android,android,renderscript,Android,Renderscript,关于如何在Android上使用渲染脚本,我一直遵循此指南 我的代码如下(我为脚本获得了一个包装器类): 此方法调用脚本: public class PixelCalcScriptWrapper { private Allocation inAllocation; private Allocation outAllocation; RenderScript rs; ScriptC_pixelsCalc script; public PixelCalcS
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)
#pragma rs java_包_名称(test.foo)
空根(常量uchar4*in、uchar4*out、uint32\u t x、uint32\u t y){
float3像素=convert_float4(在[0]).rgb;
如果(像素z<128){
像素z=0;
}否则{
像素z=255;
}
如果(像素y<128){
像素y=0;
}否则{
像素y=255;
}
如果(像素x<128){
像素x=0;
}否则{
像素x=255;
}
out->xyz=转换为3(像素);
}
现在我在哪里可以找到一些关于这个的文档
例如,我有以下问题:
1) 这个转换\u float4(在[0]中)的功能是什么
2) rgb
在这里返回什么convert_float4(在[0]).rgb代码>
3) 什么是浮动3
4) 我不知道从哪里开始这行out->xyz=convert\u uchar3(像素)代码>
5) 我假设在参数中,in
和out
是否传递了分配?
什么是内核中的x
和y
?1)中的指针是一个4元素无符号字符,也就是说,它表示一个像素颜色,其中R、G、B和a的值在0-255范围内。因此,convert\u float4
只需将四个uchar
中的每一个转换为float
。在您正在使用的这段特定代码中,使用浮点数可能没有多大意义,因为您正在执行一个简单的阈值,您也可以直接使用uchar数据。在执行其他类型的图像处理算法时,如果确实需要更高的精度(例如:模糊图像),则使用浮点更适合
2) .rgb
后缀是仅返回float4
的前三个值的缩写,即R、G和B值。如果您只使用了.r
它会将第一个值作为常规的浮点
,如果您使用了.g
它会将第二个值作为浮点
,以此类推。。。然后将这三个值指定给该float3
变量,该变量现在仅表示具有三个颜色通道(即,没有alpha通道)的像素
3) 见#2
4) 现在,convert\u 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坐标。该内核函数将为您处理的图像/分配中的每个像素调用一次,因此,通常最好知道处理图像时的坐标。在这个特定的例子中,因为它只是以相同的方式对所有像素设置阈值,所以坐标是不相关的
很难找到关于RenderScript的好文档。不过,我强烈建议您看看这两个视频,因为它们会让您更好地了解RenderScript的工作原理:
请记住,这两个视频都有几年的历史了,因此最近的API中的一些小细节可能已经改变,但总体而言,这些可能是RS的最佳信息源。1)在内核中,
中的指针是一个4元素无符号字符,即它用R,G表示像素颜色,B和A值在0-255范围内。因此,convert\u float4
只需将四个uchar
中的每一个转换为float
。在您正在使用的这段特定代码中,使用浮点数可能没有多大意义,因为您正在执行一个简单的阈值,您也可以直接使用uchar数据。在执行其他类型的图像处理算法时,如果确实需要更高的精度(例如:模糊图像),则使用浮点更适合
2) .rgb
后缀是仅返回float4
的前三个值的缩写,即R、G和B值。如果您只使用了.r
它会将第一个值作为常规的浮点
,如果您使用了.g
它会将第二个值作为浮点
,以此类推。。。然后将这三个值指定给该float3
变量,该变量现在仅表示具有三个颜色通道(即,没有alpha通道)的像素
3) 见#2
4) 现在,convert\u uchar3
又是另一个转换,它将float3
像素变量转换回uchar3
变量。您正在按该顺序将这三个值指定给x、y和z元素中的每一个。这可能是一个很好的时机来提及X、Y和Z与R、G和B完全可互换。该语句也可以使用out->rgb
,这样实际上会更具可读性。请注意,out
是一个uchar4
,通过这样做,您只分配了该指针中的前三个“rgb”或“xyz”元素,而第四个元素在此未定义
5) 是,in
是输入像素,out
是输出像素。然后x
和