c++ - screen.h头文件方法困惑

标签 c++ graphics blackberry-10

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

screen_get_buffer_property_iv(mScreenPixelBuffer, SCREEN_PROPERTY_STRIDE, &mStride)`

我不明白第一行关于在不同行的像素之间有字节是什么意思。函数是步长是通过什么得到的。

最佳答案

如果我们有一堆矩形像素(屏幕、位图或类似的东西),程序必须有一种方法来计算像素的位置。让我们称这种像素束为“表面”。

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

现在,假设我们要在像素 100,100 到 100,200 之间画一条线。我们可以轻松地将其写为:

诠释我; 对于(我= 100;我<200;我++) { setpixel(表面, 100, 100+i, 颜色);

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

关于c++ - screen.h头文件方法困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14069482/

相关文章:

ios - SceneKit 剔除平面

blackberry-simulator - 部署失败 : Info: Sending request: Install and Launch

blackberry-10 - Blackberry10应用程序安装

c++ - 如何巧妙地编写两个函数 - 一个用于检查解决方案是否存在,另一个用于获取所有解决方案?

java - 如何从 C++/JNI 调用带有 Android 上下文参数的 Java 方法

c++ - Boost Asio延迟写入tcp套接字

c++ - BB 10 Cascades 互联网检查

c++ - Winpcap 保存不是来自适配器的原始数据包

c++ - 在运行 X 窗口程序时没有得到任何输出

c# - 获取蜂窝图案上的单元格坐标