また、質問なのですが、よろしくお願いします。
画像処理で、
HBITMAP hBitmapからHANDLE hBitmapに変換する
処理が分からないので教えてください。
HANDLE → Handle to an object.
HBITMAP → Handle to a bitmap.
ですから、普通にキャストできませんか?
HBITMAP hBitmap;
HANDLE hHandle;
hHandle = (HANDLE)hBitmap;
>HBITMAP hBitmap;
>HANDLE hHandle;
>hHandle = (HANDLE)hBitmap;
と入れてみたのですが変化がありませんでした。
HBITMAP hBitmapはdlg.cppで使用しています。ここのhBitmapのデータをcppに移した
いのですが、その際HANDLE hBitmapに変更してデータを読み込ませたいのです。
どのようにしたらよいのでしょうか?
以上からでは説明不足でしょうか?
ご教授お願いいたします。
問題の周辺のソースを見せていただけますか?
// 濃淡画像に変換(2値化込み)
int i, j;
unsigned char grayLevel;
unsigned char t = 127; //閾値設定
grayFlag = 1;
grayData = (unsigned char *)malloc(sizeof(unsigned char) * size);
for (j=0; j<h; j++) {
for (i=0; i<(w*3); i+=3) {
// pixelDataの色は,BGRの順
grayLevel = (unsigned char)(0.299 * *(pixelData + j*(w*3) + i+2)
+ 0.587 * *(pixelData + j*(w*3) + i+1)
+ 0.114 * *(pixelData + j*(w*3) + i));
if (grayLevel < t)
grayLevel = 0;
else
grayLevel = 255;
*(grayData + j*(w*3) + i) = *(grayData + j*(w*3) + i+1)
= *(grayData + j*(w*3) + i+2) = grayLevel;
}
}
// ビットマップハンドルの作成
hBitmap = CreateDIBitmap(hDC, &lpBMInfo->bmiHeader, 0, NULL, NULL,
DIB_RGB_COLORS);
// ビットマップを指定
::SelectObject (hCompatiDC, hBitmap);
// 画像のバイナリデータからDIBデータを作成
SetDIBits (hDC, hBitmap, 0, lpBMInfo->bmiHeader.biHeight, grayData, lpBMInfo,
DIB_RGB_COLORS);
// hCompatiDCのデータをhDCへコピーして表示
BitBlt (hDC, 0, 0, lpBMInfo->bmiHeader.biWidth,
lpBMInfo->bmiHeader.biHeight, hCompatiDC, 0, 0, SRCCOPY);
このプログラムがdlg.cppにあります。
この2値化のデータをcppに移したいのですが。
すいません、「この2値化のデータを『cppに』移したい」というのがどうもよく解りま
せん。「cppに」って何ですか?
すみません!
>cpp
とは
BOOL SampleApp::InitInstance()
の入っているソースファイルのことです。
「ソースファイルに移したい」のなら、単にcopy/pasteでいいと思いますが、そういう意
味じゃないですよね? 他のクラスから参照したい、ということですよね?
仮に、
・SampleAppが定義されているソース→app.cpp
・dlg.cppで定義されているclass → CDlg
とすると、
SampleAppがCDlgへのポインタを持っていて、CDlgがbitmapのhandleを返すpublic関数を
持っていればいいと思います。
もしくはCDlgにSampleAppへのポインタを持たせてSampleApp側でbitmapのhandleを受け取
るpublic関数を用意するとか。
>他のクラスから参照したい、ということですよね?
はい。そうなんです。
>SampleAppがCDlgへのポインタを持っていて
とは?void *?を?
SampleAppは
BOOL CSampleApp::InitInstance()
{
AfxEnableControlContainer();
Enable3dControlsStatic();
WORD wErrorCode;
CString strErrorMsg;
#ifdef _AFXDLL
Enable3dControls(); // 共有 DLL 内で MFC を
使う場合はここをコールしてください。
#else
Enable3dControlsStatic(); // MFC と静的にリンクする場合はここをコール
してください。
#endif
CCCameraSampleDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
と続きます。
>CDlgがbitmapのhandleを返すpublic関数を持っていればいいと思います。
bitmapのhandleを返すはどのようにすればいいのでしょう?すみません・・。教えてく
ださい。
>>SampleAppがCDlgへのポインタを持っていて
>とは?void *?を?
「CDlgへのポインタ」と言ったら「CDlg*」に決まってるじゃないですか。
>>CDlgがbitmapのhandleを返すpublic関数を持っていればいいと思います。
>bitmapのhandleを返すはどのようにすればいいのでしょう?
「~を返す関数」と言ったら普通リターン値の型の事を意味しますよね。引数で返しても
いいですが。
環境は VC++6.0,MFC,win98 です。
ダイアログベースアプリケーションで
画像を取得して2値化→描画とゆう流れのプログラムにしました。
(この処理は全てCDialogで行っています)
この2値化したデータを
CWinAppにメモリから読み込むという処理のプログラムを書きたいのです。
なぜ、CWinAppでやる必要があるかがわからないのですけれど。
メモリから読み込むと言うのも良く分からないし。
メモリには既にあるわけですから、参照するだけですよね。
CWinAppでいったい何がしたいのでしょう。
ファイルに書き出したいとか、具体的にあげた方がレスもつきやすいかと。
そもそも、ビットマップを握っているCDialogクラスというのは、
CWinAppのInitInstanceの中でローカルにインスタンス化しているダイアログなのでは?
ならば、CDialogクラスから派生した自分のクラスの中でpublicなメンバー変数として
持たせれば、難なく参照できるはずでは?
基本的に情報を小出しにしすぎです。
環境周りの情報は勿論の事、出せる情報は最初の段階で出来るだけ提示しましょう。
無駄なやり取りが増えるだけで話がちっとも進みません。
CDialogのほうのhBitmapをHANDOLE hBitmapと宣言したら
>'void*' から非 'void' 型への変換には明示的なキャストが必要です。
というコンパイルエラーがでました。
これはどうやって解決したらいいでしょうか?
教えてください。
お願いします。
値が割り当てられていないローカルな変数 'hBitmap' に対して参照が行われました。
とは・・・?
>>'void*' から非 'void' 型への変換には明示的なキャストが必要です。
>というコンパイルエラーがでました。
>これはどうやって解決したらいいでしょうか?
本当にそのソースで(論理的に)正しいのか確認してください。
正しいのであれば、エラーメッセージで指示されているように明示的にキャストしてくだ
さい。
>値が割り当てられていないローカルな変数 'hBitmap' に対して参照が行われました。
>とは・・・?
文字通り、です。参照は値を割り当てた変数で行いましょう。