2015-06-17 50 views
0

我目前從分配對象像這樣讀取的RGB像素:的renderScript從分配得到RGB - Android電子

float4 elementF4TL = rsUnpackColor8888(*(uchar*)rsGetElementAt(inPixels, x-1, y-1)); 
uchar4 pixelCharsTL = rsPackColorTo8888(elementF4TL); 
float3 pixelTL = convert_float4(pixelCharsTL).rgb; 

然後我得到一個返回我想要的RGB值pixelTL.rgb。 有沒有更好的方法來做到這一點?

例如,rsUnpackColor8888uchar4作爲參數。如果我傳遞一個從rsGetElementAt_uchar4(...)設置的變量,它將返回一個uchar4它會中斷。

我不100%明白這行的意思:*(uchar*)rsGetElementAt(inPixel....

回答

2

你似乎做了很多不必要的轉換和鑄造的。例如,您只打開8888顏色表示,以便在下一行再次打包。

假設inPixels是您的uchar類型圖像的rs_allocation對象,您可以使用正常的rsGetElementAt_*(...)函數。您也許能夠做這樣的事情:

float3 pixelTL = convert_float4(rsGetElementAt_uchar4(inPixels, x-1, y-1)).rgb;

該功能可以將分配在位置提取uchar4向量(x-1,y-1),將其轉換爲float4,然後。 rgb後綴僅抓取這些元素中的前3個,使float3分配給您的變量。


而只是爲了回答你原來的問題有關*(uchar*)...

通常情況下,你會使用特定類型的函數調用,如rsGetElementAt_uchar4(...),作爲指定然後返回實際uchar4載體。

但是,如果您僅調用通用的rsGetElementAt(...),則會向第一個元素返回一個空指針 - void*。因此,您必須將該指針投射到您需要的數據類型(uchar*)rsGetElementAt(...)中,然後您必須取消引用它以獲取該指針位置*(uchar*)rsGetElementAt(...)處的實際值。但是,對於如上所示可以更簡單地完成的事情來說,很多事情是來回的。

+0

如果您正在使用(x-1)和/或(y-1),請確保您已經對邊界進行檢查(即x> 1且y> 1)。如果你不這樣做,你會從無效內存中讀取,很可能會崩潰。對於任何x的調整也是如此。您可以今天將您的分配/啓動的維度作爲全局變量傳遞。 –