0

DWORDで整列されていない生のピクセルデータ(行* col = 479 * 638)をDWORDで整列されたビットマップデータに変換する必要があります。疑いはほとんどありません。

1)dワードアラインと言うとき、それはdwordアラインされたメモリ全体を割り当てることですか、それとも幅DWORDアラインにすることですか?

2)DWORDで実際の幅を調整する場合は、DWORDで調整するため、最後に2バイトを追加して、幅= 640にします。ただし、ソースから宛先へのメモリコピーを実行すると、暗い黒が残ります。下部の線。しかし、実際の画像から混乱を招くため、これらの暗い線は必要ありません。では、どうすれば最後にこの黒い線を避けることができますか?

これを解決するために、dwordに合わせて割り当てられた合計メモリについてだと思いました。そして、私はそれだけのdword整列メモリを割り当てました。

bitmapData = (LPBYTE) GlobalAlloc(GMEM_FIXED, bmiHeader->biSizeImage);

どこ bmiHeader->biSizeImage = nrows * dowrdalignedwidth * BPP.

実際のmemcopyを実行している間、私はコピーしてに書き込みrows*cols*BPPます。これは正しいです?

4

2 に答える 2

1

画像のDWORD配置は通常、ストライド、つまり幅用であり、ピクセルではなくバイト単位で行われます。現在、ピクセル数を4の倍数に変更していますが、これにより、行あたりの合計バイト数が必要以上に、実際にはおそらく8バイト増加します。

計算(列*ピクセルあたりのビット数)を計算し、それを32ビットに揃えて、ストライドまたは幅を取得します。次に、これに高さを掛けて、完全な画像サイズを取得できます。

したがって、479 * 638である画像の場合、638は列であり、したがって幅です。
画像がピクセルあたり4バイトの場合、DWORDは4バイトであるため、特別なことをする必要はありません。したがって、バイト単位の合計幅は4バイトまたは32ビットの倍数、638 * 4=2552です。高さで合計画像サイズをバイト単位で取得します。

ただし、画像がピクセルあたり3バイトの場合、638 * 3 = 1914であり、1914は4の偶数倍ではありません。したがって、1914バイトを次の4の倍数までパディングする必要があります。

私は通常C#でこれを行っているので、使用する式は次のとおりです。

((width&bitsPerPixel)+ 31)&〜31

次に、結果を8で割って、必要に応じてビットではなくバイトで取得します。

したがって、あなたの場合、(638 * 24)/ 8を実行してDWORD整列値ではない1914バイトを取得しますが、上記の式を使用すると、4バイトの偶数倍でありストライドの正しい値である1916が取得されます。 。

于 2013-02-04T12:48:09.100 に答える
0

4bppはバイトではなくピクセルあたり4ビットを意味すると思います:)したがって、上記の計算は異なります

于 2021-01-19T19:40:12.233 に答える