在 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 中获取像素的主要内容,如果未能解决你的问题,请参考以下文章