1

`ストライド (異なる行のピクセル間のバイト数) を取得します

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 までの線を描画するとします。次のように簡単に書くことができます。

int i; for(i = 100; i < 200; i++) { setpixel(表面, 100, 100+i, 色); }

では、setpixel を実装したい場合、何をする必要があるでしょうか? 1 つのことは、x、y 座標 (100、100+i) を「ピクセルの長い行」の位置に変換することです。

一般式は になりがち(x + y * width) * bytes_per_pixelです。したがって、32bpp の画像 (1 ピクセルあたり 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 は、ビットマップ内の実際のピクセル (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 に答える