いつもお世話になっております。
今回ご教授頂きたい内容なのですが、
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では正常に動作しないのでしょうか?
色々と試してみたのですがいっこうに分かりません。
ご教授よろしくお願い致します。
No.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]の値を確認みるのが手っ取り早いと思います。
ご教授誠にありがとうございました。
おかげさまで問題を解決する事ができました。
原因はご回答頂いた「C#.NETのBitmapクラスで読み込んだビットマップにアルファチャンネルが付加されているから」という事でした。
アルファチャンネルを無視するようにすればうまくいきました。
本当にありがとうございました。
またご教授よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA : スクレイピングできない 4 2023/05/12 22:26
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 特定の文字を条件に指定範囲のデータを貼り付けるVBA 3 2023/01/15 06:14
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- Excel(エクセル) SUMIFのIF分岐について 4 2023/04/15 12:57
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Excel(エクセル) エクセルの関数について 5 2023/01/26 15:26
- Visual Basic(VBA) excel vbaでselenium basic 3 2022/10/02 12:35
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で簡単なパックマンゲーム...
-
C言語で%を使わない余りの出し方
-
課題;素因数分解
-
線形補間法プログラム(C++)
-
intとlongは同じ?
-
unsigned型のビット構成を表示...
-
再起呼び出しの回数をカウント...
-
異なるn個の整数からr個の整数...
-
画像の拡大・縮小
-
直線補間について
-
2の補数を計算するプログラム
-
カードシャッフルのブログラム...
-
c言語プログラミングについて f...
-
C言語の問題
-
C言語
-
argvのNULLチェック
-
C言語のプログラムについて(...
-
以下のプログラムはOpenCVで画...
-
OpenCVによる4値化について
-
C++で表を作成したいのです ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
再起呼び出しの回数をカウント...
-
C言語で%を使わない余りの出し方
-
迷路を脱出する経路探索プログ...
-
画像の拡大・縮小
-
分数の足し算をさせるプログラ...
-
C言語で簡単なパックマンゲーム...
-
C++で表を作成したいのです ...
-
条件が多い場合
-
複数の共有メモリの作成
-
ヒストグラム均等化処理プログラム
-
3のつく数と3の倍数を表示 C言語
-
argvのNULLチェック
-
乱数で交互に偶数、奇数が、、、。
-
プログラミングに関して
-
OpenCVによる4値化について
-
再帰処理をループ処理に変換
-
16bitで乱数を生成する方法
-
C++ Debug Errorについて教えて
おすすめ情報