問題タブ [createdibsection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
571 参照

multithreading - スレッドでのCreateDIBSectionの呼び出しについて

buildtexture という名前の関数で、OpenGL のイメージとビルド テクスチャをロードし、CreateDIBSection を呼び出すと、ビットマップが作成されます。関数 buildtexture が通常のメンバー関数として呼び出された場合、問題はありません。しかし、スレッドでこのメンバー関数を呼び出した場合、CreateDIBSection は 0 を返し、失敗したことを意味します。また、GetLastError でさえ、CreateDIBSection の呼び出し後に 0 を返しました。スレッドには、ビットマップを作成するのに十分なスペースがないと思います。そして、私はこの問題を解決する方法がわかりません。誰でも私を助けることができますか?どうもありがとうございました!

0 投票する
1 に答える
351 参照

c++ - Winでカーソルを作成しようとすると、CreateDIBSectionがスローされます

png から Cursor を作成しようとしていて、CreateDIBSection()投げています。

以下はコードのスニペットです。

投げているようCreateDIBSectionに、DCを解放するコードは実行されていません。この背後にある可能性のある問題を教えてください。

0 投票する
3 に答える
3011 参照

c++ - CreateDIBSection で「十分なストレージがありません」というエラーが発生しますが、それでも機能するようです

CreateDIBSection() を呼び出すか、LR_CREATEDIBSECTIONフラグを指定して LoadImage() を呼び出して、アプリが DIB セクションを作成しようとすると、正常に返されます。返されるHBITMAP値は有効であり、問​​題なく操作して表示できます。

ただし、GetLastError() を呼び出すと返さ8: Not enough storage is available to process this command. れます。これは、最初の呼び出しから最後の呼び出しまで発生します。要求されたビットマップのサイズは重要ではないようです。800x600 または 16x16、同じ結果。関数呼び出しの直前では、GetLastError() はエラーを返しません。さらに、関数呼び出しの前に SetLastError(0) を呼び出しても同じ結果になります。

他の人が同様の質問をしているのを見つけましたが、CreateCompatibleBitmap() を使用していて、CreateDIBSection() に切り替えると問題が解決するか、または既に CreateDIBSection() を使用していて、返される結果が無効であることがわかりました。まったく機能していません。

動作しているように見えるので、それを無視する (そしていずれかの関数を呼び出した後に SetLastError(0) を呼び出す) ことができると考えていましたが、そうすることで見落としている微妙な問題がある可能性があります。

もちろん、ここに私が使用している基本的なコードの一部を示します。まず、LoadImage() の呼び出しです。これは、私が多くのことに使用する基本的なビットマップ クラスの一部であり、より関連性の高い側面を示すためにかなり単純化しました。

CreateDIBSection の呼び出しは、通常、レイヤード ウィンドウを更新するときに行われます。

私が完全に根拠のないものについてのポインタをいただければ幸いです。

0 投票する
1 に答える
2223 参照

c++ - 16ビットデスクトップの色深度でのBitBlt+UpdateLayeredWindowおよびCreateDIBSection

ウィンドウが階層化されていないため、クライアント領域に透明な背景が黒く描画されているアプリケーションがあります。それぞれのWM_PAINTメッセージで、メモリDCに対してBitBltを実行しています。その後、レイヤードキャンバスウィンドウに対してUpdateLayeredWindowでメモリDCを使用します。

メモリのセットアップ-DC:

WM_PAINTでは、BitBlt関数を使用して、アプリのクライアント領域のDC情報をメモリDCにコピーします。その後、memory-DCを使用してレイヤードキャンバスウィンドウDC(CWnd)に対してUpdateLayeredWindowを実行しています。つまり、リアルタイムであり、結果は次のようになります。不規則な形状とピクセルごとの透明度に加えて、通常のアプリケーションウィンドウとレイヤードウィンドウがあります。

32ビットデスクトップの色深度ですべてが正常に機能します。16ビットに切り替えると、レイヤードキャンバスウィンドウがめちゃくちゃになります。描画が悪く見え、ウィンドウ全体がクリックできます。

アルファチャネル情報が不足しているためだと思います。

だから私は解決策をたくさんググった。この状況では、メモリDCを作成する必要があることがわかりました。

CreateCompatibleDC(NULL)の代わりに。互換性のあるDCは16ビットDCを提供するからです。

CreateDCを使用すると描画が向上します。ただし、ウィンドウ全体はクリックスルー可能であり、レイヤードウィンドウでは透明度が黒く描画されます。

したがって、問題はCreateDIBSectionのBitBltまたはBitmapInfoHeaderにあると思います。

  1. BitmapInfoHeader.biBitCount=32またはBitmapInfoHeader.biBitCount=16ビットのどちらを使用するかわかりません。32だと思います。biCompression->BI_RGBまたはBI_BITFIELDSはどうですか?

  2. UpdateLayeredWindowで動作するように、16ビットDCをメモリDCにBitBlt(...、SRCCOPY)した後、アルファチャネル情報をメモリDCに追加するにはどうすればよいですか?(たぶん:rgbチャネルをalphaチャネルで事前に乗算しますか?)Dunnoの方法。


16ビットデスクトップの色深度の問題に少し近づきました。

上記はうまくいくようです。しかし、UpdateLayeredWindow関数が生成する結果は乱雑に見えます。

だから、これは黒い色が欠けているからです!完全に黒だったすべてのピクセルが透明になります。透けてクリックすることもできます。他のすべてのピクセルは黒い部分を失い、クリックスルーするだけです。

テストを行いました。WindowsPaint.exeを開き、ウィンドウの幅と高さの表面を塗りつぶした色として黒にしました。

次に、それをレイヤードウィンドウ(黒色が欠落している)の下に置き、レイヤードウィンドウを再び元のウィンドウとして使用しました。ta-da、レイヤードウィンドウは、Paint.exeの黒いピクセルを通して輝くことと組み合わせて正常に見えます。

そのため、BitBltで期限切れになり、そのラスター操作パラメーターが再び有効になりました。しかし、運はありません。

UpdateLayeredWindowで描画する前に、BitBltを使用して黒色をDCにブレンドするにはどうすればよいですか?

0 投票する
1 に答える
1142 参照

c++ - 物理メモリではなくディスク上のCreateDibSection

PDFドキュメントのページを「フラット化」するために使用しているアルゴリズムでメモリの問題が発生しています。

問題は、ビットマップが非常に大きく、コピー先のDIBを割り当てている間、HBitmapをメモリに保持できない場合があることです。

ロングショットですが、どういうわけかディスクにDibセクションを割り当てても、HBITMAPを使用できますか?(ConvertBitmap関数に同じハンドルを使用します)

0 投票する
1 に答える
2935 参照

c++ - CreateDIBSection() が特定の BITMAPINFO で失敗するのはなぜですか?

を使おうとしていますCreateDIBSection

問題:

Windows XP で を呼び出そうとしましたがCreateDIBSection、返さNULLれてGetLastError= 0になります。

画面解像度を 2048 x 1536 などに変更しようとすると、正しい値が返されます。

nMemSize私は、この関数が(必ずしも小さい数ではない)と何らかの関係があることをテストしました。

質問:

CreateDIBSection正しい値を返すことを保証する方法はありますか?

0 投票する
0 に答える
1238 参照

c++ - 画面ソリューションが変更されたときに GetLastError が 0 を返すのに、CreateDIBSection が NULL を返すのはなぜですか?

以下は私のコードです:

私の OS は Windows XP で、画面の解像度は 1024*768 で、次の関数を呼び出します。

CreateDIBSection が NULL を返し、GetLastErr() が 0 を返すことがわかりました。ただし、画面解像度が 2048*1536 の場合は、次の関数を呼び出します。

CreateDIBSection が有効なハンドルを返すことがわかりました。

なんで ?

画面の解像度が原因で CreateDIBSection が無効な値を返すようですが、理由はわかりません。

しかし、一部の WINXP では、CreateDIBSection は画面解像度に関係なく常に成功します。テストから、原因は HDC にあると思います。HDC は画面の解像度に関係していますか?

0 投票する
0 に答える
1185 参照

delphi - TBitmaps を AVI ファイルに書き込もうとすると、黒いフレーム (すべてゼロのデータ) しか得られない

ファイルから JPEG フレームを読み取り、それらを AVI ファイルに書き込む Delphi アプリケーションがあります。各 JPEG フレームは TBitmap オブジェクトにデコードされ、Delphi 6 VFW.PAS ユニットを介して、AVI 操作用の Windows API DLL (AVIFIL32.DLL) によって提供されるサービスを使用して、出力 AVI ファイルに書き込まれます。

問題は、出力ファイルにすべての黒いフレームが表示されることです。AVIStreamWrite() を呼び出す前にソースとして使用している TBitmaps には有効なデータがあることがわかっています。これは、TBitmap.SaveToFile() メソッドを使用してそれらをディスクに書き込んでおり、ソース イメージが正常に見えるためです。しかし、私はまだ黒いフレームになってしまいます。TBitmap からビットを取得する方法に何か問題があります。これは、GetDIBBits() によって返されたポインタが指しているメモリ領域を調べると、すべてゼロを示すためです。

以下は私のコードです。私は何を間違っていますか?また、CreateDIBSection() によって返された最初の pBits を解放しようとすると、アクセス違反が発生します。それは正常ですか、それともそれを解放する適切な方法はありますか?

0 投票する
1 に答える
1140 参照

c++ - Bitblt、createdibsection、画像が破損して出てきます

こんにちは、スクリーンショットをキャプチャしようとしていますが、画像が破損しています。コードのどこが間違っているかを誰かが確認できます。基本的に、createdibsectionを使用して、ビットに直接アクセスできるようにしています。

結果の画像は次のようになります http://oi47.tinypic.com/33c4zko.jpg

それがコードです、そして私はこれを使って画面をキャプチャします

0 投票する
3 に答える
9227 参照

c++ - ピクセルの配列を HBITMAP に変換する方法

ウィンドウに表示するために HBITMAP に変換する必要があるピクセルの配列があります。CreateDIBitmap() を使用しようとしましたが、BMP ヘッダーがありません。MSDN のドキュメントに従って手動で作成しようとしましたが、うまくいきませんでした。

ここで私のコードがどのように見えるか

これで NULL 以外の hBitmap を取得できますが、これは常にピクセルの配列を指していないかのように黒い画像を表示します。コードを使用して確認しました

実際、qB.bmBits は NULL です。何が問題で、どのように修正するのですか?