GDI+ Graphics::DrawImage 不显示

Posted

技术标签:

【中文标题】GDI+ Graphics::DrawImage 不显示【英文标题】:GDI+ Graphics::DrawImage not showing 【发布时间】:2014-04-03 20:46:02 【问题描述】:

我仍在努力学习 WinAPI 及其各种库,我现在正试图弄清楚 GDI+。作为一个简单的测试,我正在尝试从文件中加载图像并将其绘制到屏幕上。

这是我正在使用的代码(下面有解释):

int x=0, y=0;
Image* sprite=Image::FromFile((WCHAR*)"MyImage.png");
Graphics g(dc);
std::cout<<"(x, y)=("<<x<<", "<<y<<")"<<std::endl; // Debug output
std::cout<<"(w, h)=("<<sprite->GetWidth()<<", "<<sprite->GetHeight()<<")"<<std::endl; // Debug output
g.DrawImage(sprite, x, y, (int)sprite->GetWidth(), (int)sprite->GetHeight());

所以 dc 是我正在绘制的 HDC,通过 BeginPaint() 获得。这绝对没问题,因为我可以使用该 HDC 用 Ellipse() 绘制一个椭圆,并且它显示得很好。我已经输出了精灵变量的值,它应该是一个非空指针。

奇怪的是,上面的输出显示图像的宽度和高度都是 0。这是什么原因造成的?我想也许图像没有正确加载,所以我尝试对 FromFile() 参数使用绝对路径和相对路径,但没有任何改变。我也尝试从 PNG 切换到 BMP,但那里也没有任何变化。

发生了什么事?

EDIT 刚刚测试过,如果我将图像加载为 Image* sprite=new Image(L"Path_To_Image");它工作正常。为什么它不适用于 FromFile?

【问题讨论】:

您的两个代码示例对字符串做了完全不同的事情。 Winapi 提示:永远不要使用字符串! 【参考方案1】:

Gdiplus 要求 Image::FromFile 等方法使用 Unicode 字符串。

但是,在您的代码中,您传递的是一个多字节字符串。简单地转换为 WCHAR* 不足以将字符串转换为 Unicode - 您需要在其前面加上 L 前缀(然后您应该删除转换,这不是必需的)。

【讨论】:

谢谢!似乎现在可以工作了。有点。在我的程序中,它可以正确绘制图像,但它有一个巨大的闪烁问题。我正在用每秒大约 30 次的线程循环重新绘制窗口。目前,我正在使用 g.Clear() 清除它,然后绘制此处显示的图像。随着 x 和 y 的变化,图像移动得很好。但这种闪烁是荒谬的。有没有更新窗口不闪烁的技术? 没关系。我终于发现它被称为“双缓冲”并让它发挥作用!谢谢你的帮助! :) @DanielBurnett,以后请尽量保持每个问题一个问题。 Gdiplus 很慢。通常的解决方案是通过绘制到内存 DC,然后将 blitting 到显示器进行双缓冲,尽管 30 fps 可能太快,即使原始 GDI 也无法跟上。您可能想要调查 Direct2D。

以上是关于GDI+ Graphics::DrawImage 不显示的主要内容,如果未能解决你的问题,请参考以下文章

C# GDI+导入图片如何让背景透明

我应该使用哪个 Gdiplus::Graphics::DrawImage 函数?

手记解决Graphics.DrawImage带ImageAttributes在XP报内存不足的问题

关于Jpanel中g.drawImage函数bug调试。。。

关于Jpanel中g.drawImage函数bug调试。。。

C#程序设计窗体如何将导入的图片背景变成透明?