2

MSDNによると:

nWidthSrc パラメータと nWidthDest パラメータの符号が異なる場合、または nHeightSrc パラメータと nHeightDest パラメータが異なる場合、StretchBlt はビットマップのミラー イメージを作成します。

ということで、逆さ画像を作ってみました。次のようなクラスがあります。

class Picture
{
 private:
 HBITMAP bmp; //Bitmap
 HDC pdc; //Device context
 short int w; //Weidth of bitmap
 short int h; //Heighth of bitmap

 public:
 short int x;
 short int y;
 void draw(HDC);
 void upside_down();
}

そして私はこの方法を持っています:

void Picture::upside_down()
{
 HDC dc = CreateCompatibleDC(pdc);
 HBITMAP bmap = CreateCompatibleBitmap(pdc, w, h);
 SelectObject(dc, bmap);
 BitBlt(dc, 0, 0, w, h, pdc, 0, 0, SRCCOPY);
 StretchBlt(pdc, 0, 0, w, h, dc, 0, 0, w, -h, SRCCOPY);
 DeleteDC(dc);
 DeleteObject(bmap);
}

しかし、それは機能しません、何も起こりません。DC互換性があるのだろうか、その背後にあるロジックを理解するのに常に問題がありました。

では、ビットマップを反転させるにはどうすればよいでしょうか?

4

1 に答える 1

7

画像を反転するには、ソースの高さを否定するのではなく、目的地の高さを否定します。これを行うには、目的の長方形の下部を起点として指定する必要があるため、呼び出しは次のようになります。

StretchBlt(pdc, 0, h, w, -h, dc, 0, 0, w, h, SRCCOPY);
于 2013-05-30T16:05:51.530 に答える