[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);
}
}
結果は以下のようになった。
HALFTONE 未使用
画像が小さくて見難いが、結果は一目瞭然となる。
ただし、処理には多少(数ミリ秒くらい?未計測)遅くなる。