2015-06-13 73 views
0

我一直在關注如何在Android上使用Render腳本的指南。Renderscript文檔和建議 - 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)我假設中的參數,inout是在分配傳遞開始? 什麼是xy

回答

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,而且它實際上更具可讀性。請注意,outuchar4,通過這樣做,您只分配該指針中的前三個「rgb」或「xyz」元素,第四個元素在此處未定義。

5)是的,in是輸入像素,out是輸出像素。然後xy是整個圖像中像素的x和y座標。這個內核函數將被調用一次,用於你正在處理的圖像/分配中的每個像素,因此通常知道處理圖像時的座標。在這個特定的例子中,因爲它只是以相同的方式對所有像素進行閾值處理,所以座標無關緊要。

關於RenderScript的很好的文檔很難找到。我非常建議你看看這兩個視頻雖然,因爲他們會給你的renderScript是如何工作的一個更好的感覺:

AnDevCon: A Deep Dive into RenderScript

Google I/O 2013 - High Performance Applications with RenderScript

請記住,這兩個視頻是一個幾年前,所以一些小的細節可能在最近的API上發生了變化,但總的來說,這些可能是RS的最佳信息來源。

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是一種「矢量類型」,類似於一個浮點,但其中3個。 有float2,float3和float4矢量類型的float。 (有uchar4,INT4等)

http://developer.android.com/guide/topics/renderscript/reference/overview.html可能會有所幫助

我希望這有助於。