[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 PixelsGraphics.DrawImage logo scaling incorrectly on a large image
Graphics.DrawImage 图像质量变差
相关文章推荐
- [ATL/WTL]_[初级]_[关于graphics.DrawImage绘图时显示不正常的问题]
- [ATL/WTL]_[初级]_[关于CEdit不识别WM_KEYDOWN的问题]
- [ATL/WTL]_[初级]_[关于CEdit不识别WM_KEYDOWN的问题]
- 关于使用Adoeb SVG Viewer在IE中无法正常显示SVG文档的问题
- 关于drawing_area绘图区的显示问题
- 关于jquery操作iframe中内容, 无法正常显示的问题
- 关于JKAlertDialog在多个视图控制器跳转后不能正常显示的问题的解决--IOS
- 关于android视频播放显示区域不正常的问题,一些处理方法
- 关于ext2.2.1rdadio和checkbox不能正常显示的问题解决方法
- 关于window2008计划任务前台显示和批处理无法正常执行问题的解决办法
- 关于SSH secury shell中R编程绘图图像显示问题
- 关于Blog在IE6显示不正常的问题
- 关于ubuntu开机显示running in low-graphics 问题的解决办法
- 关于 setPreviewDisplay(null) 无法正常显示的问题
- 关于使用IDE制作样式表后不能正常显示的问题
- 关于WORD 中不能显示绘图工具画的线的问题
- 关于drawing_area绘图区的显示问题
- 关于WTL中显示图片问题
- 关于drawing_area绘图区的显示问题
- 关于VS2010不能正常显示asp.net的网页项目的问题