アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。
今回ご教授頂きたい内容なのですが、
Win32APIで作成したDLLをC#.NETで使用した時のDLL内の関数の動作についておききします。
下記サイトで公開されている「ビットマップ形状に合わせてリージョンを作成する」CreateRgnFromBitmap関数についてなのですが、
http://orangeknowledge.jpn.org/tips/sdk001.html
Win32APIでこの関数をDLL化したものをWin32APIで暗黙的リンク、明示的リンクで利用した場合は正常にCreateRgnFromBitmap関数が正常に動作するのですが、C#.NETで同DLLを利用した時に、関数を呼ぶ事はできますがなぜか正常に動作しません。

デバッグモードで処理内容をみてみたのですが、
// 一行分画像データを DIB で取り出す(bmpなので下から取り出す)
GetDIBits(hDC, hBitmap, bm.bmHeight - y, 1, pScanData, (LPBITMAPINFO)&bi, DIB_RGB_COLORS);
の部分でpScanData配列に一行分の画像データが正常に入っていませんでした。
そのためGetDIBitsの次に行う判定
// 一行分の透明/非透明の変化点を調査する
for (int x = 0; x < bm.bmWidth; x++){
if (pScanData[x] != dwTransColor){ // 透明色でなければ
・・・省略・・・
で正常に判定が行われず引数としてわたされている「DWORD dwTransColor」透明色部分を正常に判定できていませんでした。
なぜWin32APIでは正常に動作するのにC#.NETでは正常に動作しないのでしょうか?
色々と試してみたのですがいっこうに分かりません。
ご教授よろしくお願い致します。

A 回答 (1件)

 こんにちは。


 C#.NETのBitmapクラスで読み込んだビットマップにアルファチャンネルが付加されているからではないでしょうか。

for (int x = 0; x < bm.bmWidth; x++){
if ((pScanData[x] & 0xffffff) != dwTransColor){ // 透明色でなければ

 として見ては如何でしょうか。
 後、RとBの関係が逆転している事も考えられます。

for (int x = 0; x < bm.bmWidth; x++){
COLORREF color = pScanData[x] & 0xffffff;
BYTE R = GetRValue(color);
BYTE G = GetGValue(color);
BYTE B = GetBValue(color);
color = RGB(B, G, R);//此処でRとBを逆転させる
if(color != dwTransColor){

 見たいにすれば逆転出来ると思います。
 取り合えず、真赤に塗り潰したビットマップを読み込ませて、pScanData[x]の値を確認みるのが手っ取り早いと思います。
    • good
    • 0
この回答へのお礼

ご教授誠にありがとうございました。
おかげさまで問題を解決する事ができました。

原因はご回答頂いた「C#.NETのBitmapクラスで読み込んだビットマップにアルファチャンネルが付加されているから」という事でした。
アルファチャンネルを無視するようにすればうまくいきました。
本当にありがとうございました。
またご教授よろしくお願いいたします。

お礼日時:2009/07/22 00:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!