您的位置:首页 > 其它

[ATL/WTL]_[初级]_[关于graphics.DrawImage绘图时显示不正常的问题]

2017-01-17 10:20 1266 查看

场景

1.使用win32绘图时, 最简单的api是使用
graphics.DrawImage(image,x,y)
来绘制, 可是这个api有个坑,它的图片显示完整和设备分辨率(显卡)有关.

说明

1.Windows使用以下约定: 1逻辑英寸(logical inch)== 96像素(pixels) == 72 points.

2.我们创建的程序一般是DPI-Aware 程序, 因为这种程序可以避免DWM自动执行DPI缩放, 它该是多少像素就是多少像素, 不会随着设备DPI的变化而变化, 同时DPI-Aware的程序改进了在更高DPI设备上的呈现; 一般在项目文件x.exe.embed.manifest里会看到类似的声明.

Dots per inch (DPI)
Device-independent pixel (DIPs).


<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>


3.GDI是通过pixel来绘制指定大小的, 它意味着如果你让GDI绘制200x100的矩形, 那么它就会在屏幕上绘制200x100像素的矩形. 不管DPI如何设置. 然而, GDI 字体大小是随着当前DPI设置而缩放的. 换句话来说就是, 如果你创建了一个72-point的字体, 字体的大小将会在96 DPI里是96像素, 在144 DPI里是144 pixels.

DPI setting   DIP size
96            1 pixel
120           1.25 pixels
144           1.5 pixels


4.现在说下graphics.DrawImage的绘图被缩放显示不正常的原因, 当用户设备DPI的值高于96 dpi 时,假设是120 dpi. 这样一张200x100 96dpi的图片实际的大小是 250x125, 而graphics.DrawImage(image,x,y)这个函数并没有指定绘制目标和源矩形, 所以默认是源矩形的200x100,目标矩形的200x100, 而源矩形实际上是250x150了,所以只绘制了图片的一部分. 这部分内容也是推理出来的, 微软官方的DPI and Device-Independent Pixels并没有说明图片在高DPI时是否会缩放, 只说明了字体会缩放.

在96DPI显示正常的图片:



在高DPI显示不正常的图片:



5.获取设备DPI的方法:

void InitializeDPIScale(HWND hwnd)
{
HDC hdc = GetDC(hwnd);
g_DPIScaleX = GetDeviceCaps(hdc, LOGPIXELSX) / 96.0f;
g_DPIScaleY = GetDeviceCaps(hdc, LOGPIXELSY) / 96.0f;
ReleaseDC(hwnd, hdc);
}


解决

1.使用带Rect方式的绘制,graphics.DrawImage(image,Rect)等其他重载函数, 让图片自动缩放.

class Utils
{
public:
static void DrawImage(Gdiplus::Graphics& graphics,Gdiplus::Image* image,
int x,int y)
{
Gdiplus::Rect dest_rect(x,y,image->GetWidth(),image->GetHeight());
graphics.DrawImage(image,dest_rect,0,0,image->GetWidth(),image->GetHeight(),
Gdiplus::UnitPixel);
}
};


参考

DPI and Device-Independent Pixels

Graphics.DrawImage logo scaling incorrectly on a large image

Graphics.DrawImage 图像质量变差
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: