【问题标题】:Do Gdiplus::Bitmap::Lock/UnlockBits always copy data?Gdiplus::Bitmap::Lock/UnlockBits 是否总是复制数据?
【发布时间】:2014-05-29 07:45:55
【问题描述】:

Gdiplus::Bitmap::Lock/UnlockBits 是否总是复制数据?或者有没有可以将相关页面映射到我的进程的地址空间,给我一个零拷贝直接访问的情况?

如果是,对参数的已知限制是什么(例如特定格式,可能仅在请求整个图像时,等等...)?

如果不是,那为什么不呢?该界面看起来旨在尽可能提供直接访问。是微软的懒惰,还是有一些技术障碍?

【问题讨论】:

  • LockBits 的抽象级别非常非常高。需要完成多少工作完全取决于图像编解码器、您要求的像素格式、图像是从流还是文件加载以及您的程序之前是否访问过像素数据。 “懒惰”当然是一种低效率的思考方式。
  • @Hans:所以你的评论暗示它总是复制?我只对使用 (width, height, format) 构造函数 btw 创建的位图感兴趣。

标签: c++ windows gdi+


【解决方案1】:

据我所知,它仅在您指定与位图格式不同的格式或使用 ImageLockModeUserInputBuf 标志时复制。

您可以通过创建一个带有位指针的位图来测试这一点,例如http://msdn.microsoft.com/en-us/library/ms536315(v=vs.85).aspx。这些位永远不会复制到 Bitmap 对象中。所以你知道当且仅当你得到一个不同的指向你给构造函数的指针时,这些位被复制了。

您可以做的另一个测试是锁定只读访问并尝试写入位。仅当您具有直接访问权限时,位图的内容才会更改。

我们对 Wine 中的 LockBits 进行了大量测试,因为它与使用此功能的 Windows 程序的兼容性很重要:http://source.winehq.org/ident?i=GdipBitmapLockBits

【讨论】:

  • “当且仅当你得到一个不同的指针指向你给构造函数的那个​​”是不正确的,它可以将相同的物理页面映射到虚拟地址空间中的不同区域......虽然不知道为什么会这样做:)。将检查其余部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2010-12-28
  • 2019-01-03
  • 1970-01-01
相关资源
最近更新 更多