在 GDI 中获取像素

Posted

技术标签:

【中文标题】在 GDI 中获取像素【英文标题】:GetPixel in GDI 【发布时间】:2011-04-22 10:15:15 【问题描述】:

使用GetPixel,在每次WM_PAINT调用绘制后,检索HDC临时存储的像素信息是正确的吗?

【问题讨论】:

【参考方案1】:

它将获得在 HDC 中选择的任何位图的 x,y 像素值。

http://msdn.microsoft.com/en-us/library/dd144909%28VS.85%29.aspx

如果我没记错的话,GetPixel 相当慢。根据您想要做什么,直接访问原始位图数据可能会快很多。

【讨论】:

但是当你这样做时,我不确定 GDI 是否会将所有操作直接刷新到你的原始位图(即 WM_PAINT 期间,在BeginPaint() 和@987654324 之间@你的位图可能不同步。)Raymond Chen最近就这个话题写了:blogs.msdn.com/b/oldnewthing/archive/2010/09/23/10066473.aspx。你当然可以通过调用GdiFlush 来“修复”这个问题,就像GetPixel 一样。但这可能只会使直接访问与首先调用 GetPixel 一样慢。 @MSalters:我不确定,但怀疑它不仅仅是 GdiFlush 使 GetPixel/SetPixel 变慢。 (除非 GdiFlush 的实现非常糟糕。:))。如果没有什么要刷新的,GdiFlush 应该是即时的。在循环中调用 GetPixel,只有第一次刷新(最多)应该减慢速度。我认为 GetPixel 的开销不仅仅是冲洗。例如可能不得不与 GPU 交谈(如果位图在 GPU 内存中),计算出它在每次调用时处理什么样的位图和像素/颜色布局/格式等。IMO,获取原始数据一次并循环应该是更快(在大多数情况下)。【参考方案2】:

视情况而定,并非所有设备都支持 GetPixel。应用程序应调用 GetDeviceCaps 来确定指定设备是否支持此功能。

【讨论】:

以上是关于在 GDI 中获取像素的主要内容,如果未能解决你的问题,请参考以下文章

Gdi+获取图像信息

GDI+下Bitmap逐像素快速读写性能测试

将 OpenGL 后台缓冲区直接复制到 GDI DC 像素数据上

GDI+ 支持的图片文件格式

如何在打印机上画一条看起来比像素还细的线?

C#中毫米与像素的换算方法