VC6.0MFCによる画像処理の質問です。

[戻る]
ひろえ 2007/06/29(金) 15:24:46
初めて質問をさせて頂きます。

【開発環境】WINDOWS XP,Visual C++ 6.0 MFC
【目的】VBから送られた画像データ(bitmapファイル)をMFC DLLで
    「getPixcel」して画像のRBG値をとりたい。
【分からないこと】画像の受け取り方(と思います)

【質問内容】「ビットマップファイルのデータを受け取り、その
データからRGB値を取るという」というところでどうしても困って
しまい質問をさせて頂きます。

MFCのCDCクラスに GetPixcelというメンバ関数があったのでそれを
使ってRBG値が取れればと思ったのですが、取得している値がどれを
とってもおかしな値になってしまい、結論として「ビットマップデータ
がうまく渡されていない」と考えております。そこから色々なサイト
MSDNなど見て回ったのですが、原因っぽいのがあるサイトがなく
こちらにて質問をさせて頂こうと思いました。

コーディング内容は以下です。

---------------------ここから----------------------------
 void __stdcall getRGB(CDC *Test_BMP)
 {
    COLORREF color;        //RGB値を格納したい変数
    int r,g,b                       // RGB値をそれぞれ入れたい変数

    color = Test_BMP->GetPixel(X,Y);        //int X,int Yは取りたい点の座標で
す。

    r = GetRValue(color);                //ここのR値(取れる値は255のみ)
    g = GetGValue(color);                //ここにG値(取れる値は255のみ)
    b = GetBValue(color);                //ここにB値(取れる値は255のみ)

}
---------------------ここまで----------------------------
正しいRGB値を取得する方法をご存知の方いらっしゃいましたら
教えて頂ければと思います。宜しくお願い致します。

PATIO 2007/06/29(金) 15:59:25
肝心のBitmapをどうやって引き渡しているのかが全くかかれていません。
これでは、正しく引き渡されているのかの判断は不可能です。
また、突然出てきているCDC* Test_BMPに関しても出所が分からないので
なんとも言いかねます。

CDCのポインタをビットマップのポインタという意識でいるのであれば、
多分勘違いしています。
CDCはあくまでもデバイスコンテキストを取り扱う為のクラスであって
ビットマップを扱う為のクラスではありません。
GetPixelしているCDCに引き渡されたと言うビットマップが選択された状態で
初めて意味があると思います。
実際には別にロードしておいてメモリDCを作成後、メモリDCに選択する
という作業が必要になると思います。

ひろえ 2007/06/29(金) 16:17:08
PATIOさん返信ありがとうございます。

もう少し詳しくなるように追加で書いてみます。

【VB側から】------------------------------------------------------------
Private Declare Sub getRGB Lib "testDLL.dll" (ByVal Test_BMP As Bitmap)
このような感じでVB側からtestDLLに対して、値渡しでTest_BMPを渡しています。

マネッジコードで書いた時は、これでうまくいっていました。。。

で、実行したいところで
Call getRGB(Test_BMP)
という呼び出し方をして、DLLでRGB値を取りたいと思っています。
-------------------------------------------------------------------------

ただ、PATIOさんが言うようにどうやらデバイスコンテキストを扱うクラスという
考え方が間違っていたようなので、今度はメモリDCを作成してみようと思います。

PATIO 2007/06/29(金) 17:23:28
えーと、
Private Declare Sub getRGB Lib "testDLL.dll" (ByVal Test_BMP As Bitmap)
で引き渡した時ってVC側では何で受け取れるんだろ?
VCでビットマップを扱うクラスはCBitmapクラスですけれど、
ちょっと検討がつかないですね。
この辺は、VBに詳しい方に譲ります。
私自身はVBを殆ど使わないのでこの辺の繋ぎは分からないのです。
逆に言うとVBとVCで受け渡しをするようなプログラムを作りたいのであれば、
この引き渡した時の挙動をきちんと把握している必要があると言う事になります。
この辺の事が説明されているような書籍があると良いのですが、
私はあいにく該当する本を知りません。
御存知の方がいらっしゃったら教えてあげてください。

Blue 2007/06/29(金) 17:57:51
VBとはVB.NETでしょうか?(VB2002,2003,2005)

VB.NETのBitmapクラスとMFCのCBitmapは直接代入できません。
よってうまくいくはずはないのです。

つうか、VBからつかうDLLを想定しているのであれば、MFCのクラスを
インタフェース(引数や戻り値)にするのはありえません。
# MFCのバージョンが違えばVC++同士でも使えなくなる可能性がある。


Bitmapハンドルを受け渡すとかCOMオブジェクトを使うとかそういうやり方
でないとうまくいかないでしょう。

古いスレッドには追加発言できません。