ページ 11

StretchBltによる縮小表示とRGB値

Posted: 2014年6月01日(日) 15:28
by rozeo
こんにちはrozeoです。

前のPPMのDIBSectionを大きさによってStretchBltで半分の大きさで描画しているんですが、半分に表示したときにところどころ色が変化してしまいます。

期待する表示
画像
実際の表示
画像

これらのサイズは1000*1000を超えてるため縮小表示しないと画面におさまりません。
そこで半分にして表示すると色が変になる…原因はStretchBltでしょうけど…
この変な色になってしまうのはどうにかなりませんか?

あともうひとつ

PPM画像のデータ部は R G B R G B R G B R G B...
のようにRGBの値が循環しているのですが、それを順番に1バイトずつ(バイナリ形式)で読み取り、RGBマクロにRGBの順に引数を渡して、DIBSectionのピクセル列に格納したら、色が反転してしまいました。

コード:

char r,g,b;
fread( &r,1,1,fp );
fread( &g,1,1,fp );
fread( &b,1,1,fp );
bPixelBits[i] = RGB( (int)r,(int)g,(int)b );//for文でピクセルの数だけまわしてる
//bPixelBits:ピクセル列
RGBマクロへ渡す引数を左右逆にすると反転せずに表示されます。

コード:

bPixelBits[i] = RGB( (int)b,(int)g,(int)r );
これはどうしておこるのでしょうか?
なお、DIBSectionを生成するにあたってBITMAPINFO構造体のbmiHeader.biHeightには負数を格納して生成しています。(正の数にしても変化なし)

Re: StretchBltによる縮小表示とRGB値

Posted: 2014年6月01日(日) 16:47
by みけCAT
rozeo さんが書きました:半分にして表示すると色が変になる…原因はStretchBltでしょうけど…
この変な色になってしまうのはどうにかなりませんか?
たまたまサンプリング時に変な色の所ばっかり当たっているかもしれません。
StretchBltを実行する前に、

コード:

SetStretchBltMode(StretchBltのコピー先のデバイスコンテキスト, STRETCH_HALFTONE);
を実行してみてください。
(すでに行っていたら申し訳ありません)

Re: StretchBltによる縮小表示とRGB値

Posted: 2014年6月01日(日) 17:39
by rozeo
みけCAT さんが書きました:
rozeo さんが書きました:半分にして表示すると色が変になる…原因はStretchBltでしょうけど…
この変な色になってしまうのはどうにかなりませんか?
たまたまサンプリング時に変な色の所ばっかり当たっているかもしれません。
StretchBltを実行する前に、

コード:

SetStretchBltMode(StretchBltのコピー先のデバイスコンテキスト, STRETCH_HALFTONE);
を実行してみてください。
(すでに行っていたら申し訳ありません)
その関数をはさむと色の件は解決しました。

あと2つ目のこともわかれば宜しくお願いします。