【问题标题】:StretchBlt() doesn't create a mirror imageStretchBlt() 不会创建镜像
【发布时间】:2013-05-26 06:33:19
【问题描述】:

根据 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 兼容性有关,我一直无法理解其背后的逻辑。

那么,我应该怎么做才能让我的位图翻转?

【问题讨论】:

  • 翻转逻辑看起来是对的。 “什么都没有发生”是指根本没有图像吗?也没有没有负高度的图像?想必你还有什么问题……
  • 好吧,当我尝试更改一些参数时,我得到了,例如,完全黑暗的图像。我在代码中显示的这些参数似乎是正确的,但我得到的不是翻转的图像,而是始终不变的相同图像。

标签: c++ winapi bitmap gdi stretchblt


【解决方案1】:

要翻转图片,您不会否定源的高度,而是否定目标的高度。为此,您必须将目标矩形的 bottom 指定为原点,因此您的调用看起来像这样:

StretchBlt(pdc, 0, h, w, -h, dc, 0, 0, w, h, SRCCOPY);

【讨论】:

  • 应该是 pdc, 0, h-1, w, -h, dc, ... 吗?第一行将是 h-1 的结尾...?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多