2012-12-28 39 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的字节。行的字节大小,即步幅,不能从其他阵列参数计算出来,并且为了正确计算任意像素的存储位置必须知道。