我应该使用哪个 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填充椭圆

GDI+ Graphics Obj - 使用 GDI 直接绘制到 DC 时消除锯齿丢失

我应该使用哪个版本的 MSXML?

我应该使用哪个:urlparse 或 urlsplit?

我应该使用哪个 Java 集合?