VC++におけるStretch Blt画像歪問題の解決方法

2331 ワード

VCでStretchBltを使用すると、ドットパターンのサイズスケールに関連するいくつかの問題に遭遇します.ドットパターンを拡張する場合、StretchBltはピクセル行または列をコピーする必要があります.拡大倍数が元の図の整数倍でない場合、この操作により画像に歪みが生じます.目的の長方形がソースの長方形より小さい場合、では、StretchBltは、画像を縮小する際に、2行(または列)または複数行(または列)の画素を1行(または列)にマージする必要があります.この操作を完了するには、アプライアンスのコンテンツ伸張モードのプロパティに基づいて1つのメソッドを選択する4つの方法があります.このプロパティを変更するには、SetStretchBltMode関数を使用します.SetStretchBltMode(hdc,iMode);iModeは以下の値をとることができる:BLACKONWHITEまたはSTRETCH_ANDSCANS(内定):2つ以上の画素が1つの画素に統合されなければならない場合、Stretch Bltは画素に対して論理AND演算を実行する.この結果、全ての元の画素が白色である場合にのみ当該画素が白色となり、実際には黒色画素が白色画素を制御することを意味する.これは白背景において主に黒色の単色ドットパターンに適用される.WHITEONBLACKまたはSTRETCH_ORSCANS:2つ以上のピクセルが1つのピクセルに結合される場合、Stretch Bltは論理OR演算を実行します.この結果、全てのオリジナル画素が黒である場合のみ黒となり、すなわち白画素によって色が決定される.これは,黒色背景において主に白色の単色ドットマトリクス図に適している.COLORONCOLOORまたはSTRETCH_DELETESCANS:Stretch Bltは、論理的な組み合わせなしに、画素行または列を簡単に除去します.これは通常、カラードットパターンを処理する最良の方法である.HALFTONEまたはSTRETCH_HALFTONE:Windowsでは、組み合わせたソースカラーから目的の平均カラーを算出します.これはハーフトーンパレットと組み合わせて使用され、第16章ではこのプログラムを示します.StretchBltで画像を縮小すると色歪みが発生することがあります.解決策は次のとおりです.
1、    DC (    HDC hDestDC) ::SetStretchBltMode (hDestDC, HALFTONE); 
2、     ::SetBrushOrgEx(hDestDC, 0, 0, NULL); 
3、     CImage   StretchBlt

例:
img.Detach();
img.Load(m_testinfo.m_StdPicutre);
::SetStretchBltMode(*pDc, HALFTONE);
::SetBrushOrgEx(*pDc, 0, 0, NULL);
img.StretchBlt(*pDc, 20, 132, 140, 198, SRCCOPY);

完璧に解決!
 
あるいはこのように解決します.
     hbit = (HBITMAP)LoadImage( NULL,cBmpPath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    if(hbit != NULL) {
     Bitmap.Attach(hbit);
     DCCompatible.CreateCompatibleDC(GetDC());
     DCCompatible.SelectObject(&Bitmap);
     Bitmap.GetObject(sizeof(bm),&bm);}

 
    2.OnPaint():
    pDC->SetStretchBltMode(HALFTONE);
    pDC->StretchBlt(MAP_LEFT,MAP_TOP,MAP_WIDTH,MAP_HEIGHT,&DCCompatible,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);