1

`获取stride(不同行像素之间的字节数)

screen_get_buffer_property_iv(mScreenPixelBuffer, SCREEN_PROPERTY_STRIDE, &mStride)`

我不明白第一行关于在不同行的像素之间存在字节的含义。该函数是通过什么来获得步幅的。

4

2 回答 2

2

如果我们有一组矩形像素(屏幕、位图等),那么程序必须有一种方法来计算像素的位置。让我们将这种像素束称为“表面”。

表面可以分割成单独的像素,然后我们可以将其放在一个很长的行中,然后从 0 到某个较大的数字(例如,1280 x 1024 的屏幕将有 1310720 像素)。但是,如果您在屏幕上显示这一长行像素,则讨论 1280 像素长且有 1024 行的像素行更有意义。

现在,假设我们要从像素 100,100 到 100,200 绘制一条线。我们可以很容易地写成:

诠释我; for(i = 100; i < 200; i++) { setpixel(surface, 100, 100+i, colour); }

现在,如果我们要实现 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 像素。

于 2012-12-28T13:24:40.353 回答
1

这里的步幅是指数组步幅,即与数组相邻行的开头相对应的内存位置之间的字节数,在这种情况下是像素。

在完全打包的数组中,步幅等于单个像素的大小乘以行中的像素数。出于性能原因,数组经常对齐,以便每一行占用“整数”字节数,通常是 2 的指数。行的字节大小,也就是步幅,不能从其他数组参数计算出来,必须知道才能正确计算任意像素的内存位置。

于 2012-12-28T12:26:23.547 回答