2012-12-28 41 views
1

`獲取步幅(字節像素之間的不同行上的數目)screen.h頭文件方法混亂

screen_get_buffer_property_iv(mScreenPixelBuffer,SCREEN_PROPERTY_STRIDE,& mStride)`

我不理解什麼第一行意味着在不同行上的像素之間有字節。這個功能就是通過這個步驟獲得的。

回答

2

如果我們有一個矩形的像素串(屏幕,位圖或其他),程序必須有一種方法來計算像素的位置。讓我們稱這種像素爲「表面」。

表面可以分成單獨的像素,我們可以把它放在一個非常長的行中,然後從0到一些很大的數字(例如,1280 x 1024的屏幕會有1310720像素)。但是如果你在屏幕上顯示這麼長的一行像素,那麼討論像素長度爲1280像素,並且有1024行像素的行更有意義。

現在,假設我們想從像素100,100到100,200畫一條線。我們可以很容易地寫成:

int i; (i = 100; i < 200; i ++) { setpixel(surface,100,100 + i,color); }

現在,如果我們要實現setpixel,我們需要做什麼?有一件事是將我們的x,y座標(100,100 + i)轉換成我們的「長行像素」的位置。

通式傾向於爲(x + y * width) * bytes_per_pixel。因此,如果我們有一個32bpp的圖像(每個像素4個字節),這將使(100 +(100 + i)* 1280)* 4

但是,爲了更容易設計圖形芯片,諸如「表面的寬度必須是X的偶數倍」,其中X通常是16,32,64或2的某個其他冪。有時,它必須直接爲2的冪(例如早期的紋理opengl的大小隻能是2^nx 2^n像素 - 你不必使用整個紋理)。這是跨步進來的地方。

假設我們想要一個100 x 100像素的位圖。但是我們用來將位圖繪製到屏幕上的圖形芯片有一個規則,你必須有32個像素寬的表面的偶數倍。所以,我們做這樣的事情

XXXXXXXXXX... 
XXXXXXXXXX... 
XXXXXXXXXX... 
XXXXXXXXXX... 
XXXXXXXXXX... 
XXXXXXXXXX... 
XXXXXXXXXX... 
XXXXXXXXXX... 
XXXXXXXXXX... 
XXXXXXXXXX... 

的X在這裏表示實際的像素在我們的位圖(10%X)和... 28個像素的「廢物」,我們必須要做出圖形芯片快樂。

現在使用寬度的公式不起作用,因爲從創建位圖的軟件中,寬度是100像素。我們需要「在每行像素的末尾額外的空間」,以改變算算彌補:現在

(x + y * stride) * bytes_per_pixel

,該stride是128,但width爲100個像素。

+0

哇真的很好的解釋。非常感謝 :) – Tahlil

1

這裏的步幅是指array stride,這是存儲器位置之間對應於數組的相鄰行的開始的字節數,在這種情況下是像素。

在完整打包的數組中,步幅等於單個像素的大小乘以行中的像素數。出於性能方面的原因,數組經常對齊,因此每一行都需要「四捨五入」的字節數,通常是指數爲2的字節。行的字節大小,即步幅,不能從其他陣列參數計算出來,並且爲了正確計算任意像素的存儲位置必須知道。