2013-07-01 111 views
1

我開始探索renderscript的力量。Renderscript - 獲取鄰居像素

嘗試2D圖像數據,我可以將像素轉換爲其他像素。 但是,如何從輸入分配中獲取相鄰像素?

我是如何做內置的convolve3x3過濾器,當它需要相鄰像素操作,它很好地鉗位圖像邊緣的像素。

假設我有功能

void root(const uchar4 *v_in, uchar4 *v_out) { 
    float4 f4 = rsUnpackColor8888(*v_in); 
    // do something on pixel 
    uchar4 u4 = rsPackColorTo8888(f4); 
    *v_out = u4; 
} 

我真的應該索引V_IN像V_IN [1]或V_IN [K],以獲得其它的像素,或者是有一些巧妙RS *函數來獲取相鄰的水平/垂直像素,同時提供適當的圖像大小鉗位,這樣我就不會索引v_in陣列的大小?

回答

1

如果您想查看相鄰像素(並且您正在使用rs_allocations),則應該只使用一個全局rs_allocation而不是將其作爲* v_in傳遞。這看起來像:

rs_allocation in; 

// Using the new kernel syntax where v_out becomes the return value. 
uchar4 __attribute__((kernel)) doSomething(uint32_t x, uint32_t y) { 
    uchar4 u4 = rsGetElementAt_uchar4(in, x, y); // You can adjust x,y here to get neighbor values too. 
    float4 f4 = rsUnpackColor8888(u4); 
    ... 
    return rsPackColorTo8888(f4); 
} 

不幸的是,有沒有好的辦法讓一個普通rs_allocation自動夾緊,但你可以調整你的代碼做手工邊緣夾。保持將maxX,maxY作爲全局變量傳遞給腳本,然後在任何rsGetElementAt *()之前動態檢查您是否在範圍內。如果您確實需要自動夾緊/包裝行爲,則還可以檢出rs_sampler和rsSample()API。

+0

嗯,但是我得到SDK Tools 22.0.1的錯誤:SDK級別11-15中不支持非根計算內核doSomething()。 這是一些新的尚未發佈的API嗎? –

+0

哦,我只是用內核的新語法(可以傳遞值)而不是指針的東西。如果你喜歡,你可以轉換我寫的代碼來使用輸出指針(* v_out)。 –

+0

好的,仍然是所有的混淆,RS語法的各種版本等,我會等待官方的RS API 18或它叫什麼,然後再試一次。謝謝。 –