【问题标题】:drawing in Windows memory device context - resolution?在 Windows 内存设备上下文中绘图 - 分辨率?
【发布时间】:2013-04-30 09:00:51
【问题描述】:

我正在尝试以位图的形式导出我的程序生成的绘图。在内存中创建位图(使用 CreateDIBSection)并将其保存在磁盘上(使用 GDI+)没有问题。要绘制,我必须使用设备上下文,并且唯一容易获得的是与屏幕兼容。所以我创建了一个兼容的 dc,选择我已经创建的位图到这个设备上下文中,我准备在位图中绘制和打印。它有效 - 但它让我无法控制绘图的大小(注意:绘图的大小,而不是位图的大小)。如果我正确理解正在发生的事情,则映射模式遵循屏幕 DC 的 DPI,这反过来意味着绘图的大小(以及我放在绘图上的文本)在不同的计算机上是不同的。

是否有任何方法可以更改设备上下文的 DPI 分辨率?或者也许存在一种更好的方法来做我想做的事情?完美的解决方案是询问用户像素位图的大小,并能够绘制一个非常适合位图的图。

【问题讨论】:

    标签: winapi memory bitmap resolution gdi


    【解决方案1】:

    由于您已经使用 Gdiplus 而不是 GDI,因此您不必使用设备上下文进行绘制。您只需将Gdiplus::Graphics 对象与Gdiplus::Bitmap 关联,而不是HDC。单位和转换更不用说位图大小了,都与设备无关。希望对您有所帮助。

    Gdiplus::Bitmap bitmap( L"miranda_kerr.png" ); // draw over existing
    Gdiplus::Graphics graphics( &bitmap );
    
    Gdiplus::Pen pen( Gdiplus::Color(255,0,0));
    Gdiplus::Status status = graphics.DrawLine( &pen, 20, 20, 100, 500 );
    //...
    

    【讨论】:

    • 可能是个好主意,诀窍是,我的代码使用 GDI+ 仅用于保存,而不用于绘图。但也许是时候重做这部分程序了:(
    • 假设您已经使用 Win GDI,重做应该没什么大不了的,毕竟 GDI+ 是 GDI 的 C++ 扩展。此外,您可以将您的渲染函数编写为foo(Gdiplus::Graphics &g /*...*/),并使用它来处理图像和视口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多