我应该使用哪个 Gdiplus::Graphics::DrawImage 函数?
Posted
技术标签:
【中文标题】我应该使用哪个 Gdiplus::Graphics::DrawImage 函数?【英文标题】:Which Gdiplus::Graphics::DrawImage function should I use? 【发布时间】:2011-02-18 15:35:24 【问题描述】:我想将一个 (x,y,w,h) 子矩形从 src 粘贴到 dest,以便 (x,y) 源像素显示为 (0,0) dest 像素。我很难决定是哪一个庞大的超载做到了这一点。现在我的代码看起来像这样,这显然不起作用:
auto_ptr<Gdiplus::Graphics> g(Gdiplus::Graphics::FromHDC(pDC->GetSafeHdc()));
g->DrawImage(png, r.top, r.bottom, r.Width(), r.Height());
g->Flush();
它不起作用,因为 (x,y) 源像素显示为 (x,y) 目标像素,而我希望它显示为 (0,0) 目标像素。源矩形和目标矩形应该具有相同的大小但不同的偏移量,而不是相同的偏移量。
[编辑] 没关系,我找到了我需要的重载函数。我只需要添加前面的目标 (x,y) 偏移量和末尾的 UnitPixel。
auto_ptr<Gdiplus::Graphics> g(Gdiplus::Graphics::FromHDC(pDC->GetSafeHdc()));
g->DrawImage(png, 0, 0, r.left, r.top, r.Width(), r.Height(), Gdiplus::UnitPixel);
g->Flush();
【问题讨论】:
我不确定 gdiplus,但在类似情况下,我猜您需要传递 png 的宽度和高度而不是 r。还要确保图像适合可用的矩形。 r 具有 png 宽度/高度。它是在我粘贴代码之前完成的。 我从您的标题中删除了“已解决”标签 - 因为您自己找到了解决方案,您应该将其发布为您自己问题的答案并接受它,这样您就可以使用内置的-in 机制,用于标记网站提供的已回答问题。我认为这样做甚至有一个徽章。 我之前尝试过这样做,但“回答你自己的问题”按钮永远不起作用。我不知道这是否是因为我使用 Chrome 或其他东西。我的意思是我点击它但没有任何反应。 【参考方案1】:任何人都会工作,他们工作得一样好。它们大多只是彼此的别名。我猜你使用的是this one,它声明:
x [in] REAL 指定的实数 左上角的 x 坐标 目标矩形的角在 绘制图像。
y [in] REAL 指定的实数 左上角的 y 坐标 目标矩形的角在 绘制图像。
尝试将 x 和 y 值改为 0,这样调用就变成了:
auto_ptr<Gdiplus::Graphics> g(Gdiplus::Graphics::FromHDC(pDC->GetSafeHdc()));
g->DrawImage(png, 0, 0, r.Width(), r.Height());
g->Flush();
除此之外,您还必须更具体地说明什么“不起作用”。是不是画错了?根本没有画出来吗? png 是否正确加载? 如果没有绘制任何内容,我建议您检查 DrawImage 的返回值(Status),该值应该为您指明正确的方向。
编辑
好的,所以如果你不希望它被映射为 src(0, 0) 到 dest(0, 0) 我想你可以使用 this one 代替。这会让你决定
src[x|y] [in] REAL 实数 指定 [x|y] 坐标 部分的左上角 要绘制的源图像。
希望这会有所帮助。
【讨论】:
它不起作用,因为 (x,y) 源像素显示为 (x,y) 目标像素,而我希望它显示为 (0,0) 目标像素。源矩形和目标矩形应该具有相同的大小但不同的偏移量,而不是相同的偏移量。以上是关于我应该使用哪个 Gdiplus::Graphics::DrawImage 函数?的主要内容,如果未能解决你的问题,请参考以下文章
Gdiplus::Graphics::DrawLine绘制直线
Gdiplus::Graphics::FillEllipse填充椭圆