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

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

【问题讨论】:

    标签: c++ c windows gdi


    【解决方案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 来确定指定设备是否支持此功能。

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 2016-01-06
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多