[BMP]SetStretchBltMode | Assertion Failed!

[BMP]SetStretchBltMode

拡大/縮小した画像を綺麗に表示(補間)する


StretchDIBits で拡大/縮小した画像はビット情報が荒い状態である。


これを解消するためには、SetStretchBltModeでビットマップの伸縮モードを

設定すればよい。


追加するのは、StretchDIBitsをコールする直前でよい。


SetStretchBltModeには伸縮モードを引数として渡すが、

今回使用するのは「HALFTONE」である。


[HALFTONEについてのMSDNの説明]

コピー元長方形内のピクセルをコピー先長方形内のピクセルブロックに関連付けます。

コピー先ブロックの平均的な色は、コピー元のピクセルの色に近い色になります。



void CSampleDlg::OnPaint()
{
  if (IsIconic())
  {
    ・・・中略
  }
  else
  {
    CPaintDC dc(this);


    // 幅と高さを半分にする。
    int nWidth = m_bih.biWidth / 2;
    int nHeight = m_bih.biHeight / 2;


    CBitmap bmp;
    BYTE *pImg;


    HBITMAP hbmp = (HBITMAP)::CreateDIBSection(dc.GetSafeHdc(), (BITMAPINFO*)&m_bih,
      DIB_RGB_COLORS,(void**)&pImg,NULL,0);


    memcpy(pImg, m_pImg, m_bih.biSizeImage);


    bmp.Attach(hbmp);


    dc.SetStretchBltMode(HALFTONE);


    ::StretchDIBits(dc.GetSafeHdc(), 0, 0, nWidth, nHeight,
      0, 0, m_bih.biWidth, m_bih.biHeight, m_pImg,
      (BITMAPINFO*)&m_bih, DIB_RGB_COLORS, SRCCOPY);
  }
}


結果は以下のようになった。



Assertion Failed!-SetStretchBltMode

HALFTONE       未使用



画像が小さくて見難いが、結果は一目瞭然となる。

ただし、処理には多少(数ミリ秒くらい?未計測)遅くなる。