imgctl.dllの機能のひとつであるCreateDIB関数の使い方が分りません。
付属のリファレンスには
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
HDIB CreateDIB(const BITMAPINFO *pbmi, LPCVOID pvData)
BITMAPINFO構造体及び実データのビット並びからDIBデータを作成して、そのハンドルを返します。
v1.10B4 より、pvData にNULLを指定出来るようになりました。
NULLを指定した場合、実データ部が 0 で埋められたDIBデータを返します。
Visual Basic では、NULLの代わりに 0 を指定します。
v1.12B3 より、トップダウン形式からの作成が可能になりました。
====================
ICERR_MEM_ALLOC
ICERR_PARAM_NULL
ICERR_IMG_COMPRESS
ICERR_IMG_RLESIZE
ICERR_IMG_BITCOUNT
ICERR_IMG_AREA
ICERR_IMG_RLETOP
====================
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
とありますが、引数LPCVOID pvDataには何を渡せば良いのでしょうか、
BITMAP構造体だと思ったのですがうまくいきません。
どうかよろしくお願いします。
No.2ベストアンサー
- 回答日時:
こんばんは。
すんません、的ハズレな事を書いてしまいました。NULLの場合ではなく、pvDataに何を入れるべきかと言う事でした。
pvDataには、これから作成するDIBの元となる、グラフィックの配列を入れると言う事です。
例えば、これから作成するDIBが 320 x 240 x 24bit(3byte)である場合、 320 x 240 x 3 = 230400byte の一次元配列を入れる事になります(その位置次元配列に絵のデータが入っている訳です)。
//320 x 240 x 24bitの真っ黒なDIBハンドルを作成する
BITMAPINFO bmi = {sizeof(BITMAPINFOHEADER)};
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biWidth = 320;
bmi.bmiHeader.biHeight = 240;
//1ピクセル辺りのバイト数
const int bytesPerPixel = (bmi.bmiHeader.biBitCount / 8);
//1行辺りのバイト数
const int strideByte = bmi.bmiHeader.biWidth * bytesPerPixel;
//イメージ全体のバイト数
bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biWidth * bmi.bmiHeader.biHeight * bytesPerPixel;
//グローバルメモリを作成する(win32api)
HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, bmi.bmiHeader.biSizeImage);
//グローバルメモリからポインタを開く(win32api)
LPBYTE pData = (LPBYTE)::GlobalLock(hMem);
//適当にグラデーションを作る
for(int y = 0; y < bmi.bmiHeader.biHeight; ++y)
for(int x = 0; x < bmi.bmiHeader.biWidth; ++x)
{
const int pos= (x * bytesPerPixel) + (y * strideByte);
pData[pos]= x * ((double)255 / (double)bmi.bmiHeader.biWidth);
pData[pos+1]= 0xff;
pData[pos+2]= (bmi.bmiHeader.biWidth - x) * ((double)255 / (double)bmi.bmiHeader.biWidth);
}
//先程作成したpDataを元にDIBハンドルを作成する(imgctl.dll)
HDIB hDIB = ::CreateDIB(&bmi, pData);
//ウィンドウデバイスコンテキストを取る(win32api)
HDC hDC = ::GetDC(hWnd);
//ウィンドウに描写する(imgctl.dll)
::DIBtoDC(hDC, 0, 0, bmi.bmiHeader.biWidth, bmi.bmiHeader.biHeight, hDIB, 0, 0, SRCCOPY);
//ウィンドウデバイスコンテキストの解放(win32api)
::ReleaseDC(hWnd, hDC);
//DIBハンドルを消去(imgctl.dll)
::DeleteDIB(hDIB);
//グローバルメモリのポインタを閉じる(win32api)
::GlobalUnlock(hMem);
//グローバルメモリを消去(win32api)
::GlobalFree(hMem);
お礼が遅れてすみません。
すばらしい!貴重なコードをありがとうございます。
問題解決しました。また何かありましたらよろしくお願いします。
No.1
- 回答日時:
こんばんは。
NULLを入れると、真っ黒なDIBを作成するのだそうです。
HDIB型はHBITMAP型とは関係ないので、SelectObject()api等に渡してはいけないので要注意。
以下はウィンドウに真っ黒なDIBを表示します。参考程度に。
//320 x 240 x 24bitの真っ黒なDIBハンドルを作成する
BITMAPINFO bmi = {sizeof(BITMAPINFOHEADER)};
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biWidth = 320;
bmi.bmiHeader.biHeight = 240;
//DIBハンドルを作成する(imgctl.dll)
HDIB hDIB = ::CreateDIB(&bmi, NULL);
//ウィンドウデバイスコンテキストを取る(win32api)
HDC hDC = ::GetDC(hWnd);
//ウィンドウに描写する(imgctl.dll)
::DIBtoDC(hDC, 0, 0, bmi.bmiHeader.biWidth, bmi.bmiHeader.biHeight, hDIB, 0, 0, SRCCOPY);
//ウィンドウデバイスコンテキストの解放(win32api)
::ReleaseDC(hWnd, hDC);
//DIBハンドルを消去(imgctl.dll)
::DeleteDIB(hDIB);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl 画像が表示でnull; this.src 1 2022/04/19 11:31
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- その他(開発・運用・管理) フォルダの中にファルダを作成してファイルを格納するバッチコマンド 1 2022/06/30 11:39
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- その他(開発・運用・管理) バッチファイルで特定のファイル・ディレクトリ以外を削除する方法について 4 2022/05/31 14:03
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(コンピューター・テクノロジー) ChatGPT ExcelVBAの精度は3.5と4で違いはある? 1 2023/04/21 21:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
shell32.dll のアイコンを使っ...
-
res://ieframe.dll/について
-
ASP.NETのDLL入れ替えについて
-
VBにてIMEの入力モードを変える...
-
DLLの暗黙的リンクについてご教...
-
M365にアップデートしてからコ...
-
C# DLL エントリ ポイントが...
-
visual studioの不要なDll削除方法
-
最新 InstallShield CAB の編集
-
about:blankの削除したいのです...
-
python エラー
-
エクセルのエラーメッセージ「4...
-
<math.h>があるのにsqrtが・...
-
<unistd.h>をVisualStudioでつ...
-
math.hに含まれる関数が使えない
-
C言語をコンパイルするとコンピ...
-
実行後にコンパイルに失敗しま...
-
アプリケーションのDLLファイル...
-
VBAを何回も作り直して、容量が...
-
適切な変換関数が存在しない???
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
M365にアップデートしてからコ...
-
C# DLL エントリ ポイントが...
-
visual studioの不要なDll削除方法
-
res://ieframe.dll/について
-
ASP.NETのDLL入れ替えについて
-
C++製DLLにてVB.NET関数を引数...
-
VB6.0(SP6)にて開発を行なって...
-
ファイルをvbaで圧縮したいので...
-
WIN10で常にフォームを手前に
-
VB.NET xdoc2txtをつかってPDF...
-
VC++6.0 でのライブラリ参照方法
-
VB2003で レジストリを格納する
-
user32.dllがないためアプリが...
-
エクセル マクロで指定フォルダ...
-
vb6で作成した画面が処理に時間...
-
VBAエディタのコード画面で、カ...
-
[VBA]64b版-行数表示.dllの登録...
-
指定された引数が有効範囲にな...
-
Java hs_err_pid0000.log解析
-
メイクファイルからdllを生成す...
おすすめ情報