WIC を使用して画像を読み込み、各ピクセルの RGB 値を取得できるようにしたいと考えています。getDataPointer()を使用してバイトバッファー ( COLORREF配列にキャスト)を作成するところまで行きましたが、この後はおかしくなりました。
テスト中の10x10 24ビットpngがあります。サイズの値を見ると、getDataPointer()で300 と表示されます。これは 10 * 10 * 3 (ピクセルあたり 3 バイトの場合) = 300 であるため、意味があります。検出。
そこで、反復子を使用してCOLORREFを通過するループを作成します。配列内に 100 ピクセルしかないことがわかっているため、条件はi < size/3です。次に、マクロGetRValue()、GetGValue()、およびGetBValue()を使用して RGB 値を取得します。
これは、物事が奇妙になるときです-私の小さな画像は、赤、緑、青、黒のピクセルが入った単なるテスト画像ですが、RGB値が出てきます (255, 0, 0), (0, 255, 0), ( 27, 255, 36)、(0, 0, 0) など、一部の値が正しく出力されず、何らかの形で壊れているようです。また、画像の最後の 20/30 ピクセルは、大量のクレイジーな色であるか、すべて黒であり、何らかの破損があると思われます。
また、より大きな実際の写真でテストしましたが、これはすべてグレースケールで同じパターンを繰り返しているため、ストライドの問題だと思いますが、 getPixelFormat()を呼び出すと、WIC が 24bppBGR または 24bppRGB であると言うため、方法がわかりません。画像。
誰かが私が間違っていることを知っていますか? COLORREF やマクロなどを使用するべきではありませんか?
御時間ありがとうございます。
編集
うーん、まだ問題があります。PixelFormat() が 24bppBGR として報告している別の 24 ビット PNG を試してみましたが、歪んで描画されているため、ストライドがずれているか何かのようです (必須のニャンキャット テスト):
編集2
さて、うまくいくものとそうでないものがあるようです。24bpp BGR が機能していると報告するものもあれば、上の画像のように見えるものもあります。ストライドを計算すると、本来あるべきものと比較して、それらは異なり、バッファのサイズも異なります。また、いくつかの 32bpp BGR イメージがありますが、それらのいくつかは機能し、他のものは機能しません。ここで何か不足していますか?バッファ内の余分なバイトを構成するものは何ですか?
画像の例を次に示します。
24bppBGR JPEG:
width = 126
height = 79
buffer size = 30018
stride = 380
これを計算すると:
buffer size should be: width * height * 3 = 126 * 79 * 3 = 29862
difference between calculation and actual buffer size: 30018 - 29862 = 156 bytes
stride size should be: width * 3 = 378
difference between calculation and actual buffer size: 380 - 378 = 2 bytes
I was thinking that we had 2 extra bytes per line but 79 * 2 is 158 not 156 hmm.
これまでに機能した画像に対してこれらの計算を行うと、計算とコードが提供する値に違いはありません...
ここで何が間違っているのか理解していますか? これらの計算は、私が考えたように機能するはずですか?
再度、感謝します