`获得步幅(不同行上像素之间的字节数)
screen_get_buffer_property_iv(mScreenPixelBuffer,SCREEN_PROPERTY_STRIDE,& mStride)`
我不明白第一行是关于在不同行上的像素之间有字节的意思。该功能是通过它获得的步幅。
答案 0 :(得分:2)
如果我们有一组矩形像素(屏幕,位图或其他像素),程序必须有办法计算像素的位置。让我们称这种像素为“表面”。
表面可以分成单个像素,然后我们可以将它放在一个非常长的行中然后从0到一些大数字(例如1280 x 1024屏幕将具有1310720像素)。但是如果你在屏幕上显示这一长行像素,那么谈论1280像素长的像素行会更有意义,并且它们有1024行。
现在,假设我们想要从像素100,100到100,200绘制一条线。我们可以轻松地将其写为:
int i; for(i = 100; i <200; i ++) { setpixel(surface,100,100 + i,color); }
现在,如果我们想要实现setpixel,我们需要做什么?有一件事是将我们的x,y坐标(100,100 + i)转换为我们的“长行像素”的位置。
通用公式往往为(x + y * width) * bytes_per_pixel
。因此,如果我们有一个32bpp的图像(每个像素四个字节),那就会产生(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代表我们位图中的实际像素(每X 10个),以及......我们必须拥有的28个像素的“浪费”才能使图形芯片满意。
现在使用宽度的公式不起作用,因为从创建位图的软件中,宽度为100像素。我们需要更改数学以弥补“每行像素末尾的额外空间”:
(x + y * stride) * bytes_per_pixel
现在,stride
为128,但width
为100像素。
答案 1 :(得分:1)
此处的步幅是指array stride,即对应于数组相邻行开头的内存位置之间的字节数,在这种情况下是像素。
在完全打包的数组中,步幅等于单个像素的大小乘以行中的像素数。出于性能原因,数组经常对齐,以便每行采用“舍入”字节数,通常为2的指数。行的字节大小(即步长)不能从其他数组参数计算,必须知道才能正确计算任意像素的内存位置。