0

布局:

我正在使用第三方控件来扫描文档。我在扫描图像时发生了一个事件(主要用于为图像添加注释)。该事件只为我提供了一个名为.PAhDC的属性。此属性是在将图像写入文件之前存储图像的 DC 的句柄。因此,我可以在将图像写入文件之前对其进行更改。

预期结果:

我想简单地在图像的最顶部添加一条 1/4 英寸(比如说 100 像素)的空白线。如果我的原始图像是 200x200 (WxH),那么我的新最终图像需要是 200x300。

问题和其他想法:

我如何只知道它的 DC 句柄来更改现有图像?我正在考虑做类似以下的事情......

  1. 创建一个新的 DC。
  2. 创建一个比原始图像高 100 像素的新位图。
  3. 在新 DC 中使用该新位图。
  4. 将原始图像复制到新位图(距离顶部 100 像素作为起点)。
  5. 然后使用 SelectObject 之类的东西将原始 hDC 中的旧位图替换为新的位图,然后销毁旧的位图对象。

注意:我想尽可能使用 MANAGED CODE 来做到这一点。使用 SelectObject() 是我能想到的唯一方法,但它当然是非托管代码......:/

4

2 回答 2

0

当然,您可以在托管代码中执行此操作。所有 P/Invoke 声明都可以从任何体面的搜索引擎中轻松获得。

  • 创建新 DC 时,请确保它是与原始 DC 兼容的 DC
  • 创建新位图时,请确保它与 DC 兼容
于 2012-10-31T22:05:47.780 回答
0

您不能不与位图所有者和 DC 合作。

DeviceContext 纯粹是底层 DIB/位图的视口,没有大小或尺寸的概念(超出剪辑区域) 虽然您可以创建新位图并将其选择到 DC 中,但应用程序很可能会忽略您已经完成并使用了它创建的 DIB。这样做的最终结果将是 GDI 对象泄漏并且底层图像没有变化。

要按照您的要求进行操作,您将需要与其他代码充分合作,并添加一个允许您替换基础数据的方法。

于 2012-11-01T15:11:50.303 回答