0

レイアウト:

サードパーティ製のコントロールを使用してドキュメントをスキャンしています。画像をスキャンすると発生するイベントがあります (主に画像に注釈を追加するために使用されます)。このイベントでは、.PAhDCという名前のプロパティが 1 つだけ提供されます。このプロパティは、ファイルに書き込まれる前にイメージを格納する 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

You can't without cooperation with the owner of the bitmap and DC.

The DeviceContext is purely a viewport onto an underlying DIB/bitmap and has no concept of size or dimensions (beyond the clipping region) While you can create a new bitmap and select it into the DC, it's highly likely that the application will just ignore what you've done and use the DIB that it has created. The end result of this will be GDI object leaks and no change to the underlying image.

To do what you you ask, you will need full cooperation with the other code and them adding a method that allows you to replace the underlying data.

于 2012-11-01T15:11:50.303 に答える