初めまして。
今回VB.NETからGDI(GDI+やDirectXではなく)を用いて画像処理を行いたいのですが、
デバイスコンテキスト(以下DC)を必要とするものがあり困っています。
MSDNライブラリにはDCと同等になるものはないと書かれていますが、何とかして利用することができませんでしょうか?
(例えばBitBltAPIなど)
ヒント程度で構いませんので、よろしくお願いします。
User32のGetDC関数を使えばできますよ。(GetWindowDCやGetDCExでも可)
FormのDCを獲得するには、Form.Handle.ToInt32で得たウィンドウハンドルをGetDCに渡せばOKです。あと、Form以外でも、Controlクラスを継承しているものならHandleプロパティが実装されていますので、PictureBoxなどでも同じことができます。
それと、宣言するときに
Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As System.IntPtr) As System.IntPtr
のように、Integerの部分をIntPtrクラスにしておけば、Handle.ToInt32のようにIntPtrクラスから32bitの形式に直す必要がなくなり、単にHandleだけでよくなるので楽ですよ。
.netのヘルプを見るとGDIが使えなさそうなわかりにくい表現が使われていますけど、.netのGDI+とGDI、GDI+とDirectX見たいな組み合わせでアプリケーションを作ることもできるようです。
余談ですが、
GDI+はデフォルトの設定がアルファブレンド処理を行うのようになっているものが多いので、気をつけないと処理が重たくて大変なんですよ。これを知らなかったときは、.netのGDI+は重たくて使えないなーなんていってました。
今では、アルファブレンドができるし、グラデーションできるし、機能が多くて.net買ってよかったと思ってます。
お返事ありがとうございます。
Y2さんの言うように(おっしゃる通りに書けたかどうかはわかりませんが)
先ほど以下のようなプログラムを書いて、実行してみましたが、
エラーはでないのですが、転送先に表示されませんでした。
イマイチ原因がわからないので、指摘していただけないでしょうか。
もしよかったらサンプルコードを書いていただけるとありがたいのですが……。
hDest = GetDC(Me.pbxDest.Handle.ToInt32)
hSrc = GetDC(Me.pbxSrc.Handle.ToInt32)
Call Me.BitBlt(hDest, 0&, 0&, Me.pbxSrc.Width, Me.pbxSrc.Height, hSrc, 0&, 0&, Me.SRCCOPY)
書き込みが遅れてスミマセン。
Y2さんのおかげで無事解決できましたので、サンプルを書いておきます。
ちなみに、教わったソースを元に少し改造してあります。
Dim hDCSrc As IntPtr = CreateCompatibleDC(IntPtr.Zero)
'ここでのSPRITE_IMGNAMEはファイル名
Dim hBMPSrc As IntPtr = LoadImage(0&, SPRITE_IMGNAME, IMAGE_BITMAP, 0&, 0&, LR_LOADFROMFILE)
Dim hDefaultBMPSrc As IntPtr = SelectObject(hDCSrc, hBMPSrc)
Dim hDCDest As IntPtr = GetDC(Me.Handle)
BitBlt(hDCDest, 0&, 0&, Me.ClientSize.Width, Me.ClientSize.Height, hDCSrc, 0&, 0&, SRCCOPY)
DeleteDC(SelectObject(hDCSrc, hDefaultBMPSrc))
DeleteObject(hDCSrc)
ReleaseDC(Me.Handle, hDCDest)
ツイート | ![]() |