問題タブ [getdibits]
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.
c++ - C++/Win32: HBITMAP からアルファ チャネルを取得する方法は?
HBITMAP
アルファチャンネルデータを含んでいます。::AlphaBlend
GDI 関数を使用してこれを正常にレンダリングできます。
しかし、::GetPixel
GDI 関数を呼び出すと、アルファ コンポーネントを含む値が返されません。ドキュメントには、ピクセルの RGB 値を返すと書かれています。
のピクセルのアルファ チャネル値を取得する方法はありますHBITMAP
か?
::AlphaBlend を使用するタイミングと、ソース HBITMAP 内の特定の色を透明として扱う昔ながらの方法を使用するタイミングを検出できるようにしたいと考えています。
答え
GetDIBits を使用して、イメージの最初 (またはそれ以上) のスキャン ラインを取得します。
delphi - Builder と Delphi による Inscriber テクノロジー - アルファ チャネルのサポート
Inscriber Technology の Via Builder を使用しています。このアプリは、TGA シーケンス アニメーションを 1 つの .via ファイルにマージし、このファイルが最適化されているため、大きなシーケンスをロードする方がはるかに優れています。一部のアドビ製品でこれを使用するためのプラグインがあります。
私は Delphi に取り組んでいますが、私の問題は、フレームから元のアルファ チャネルを取り戻せないことです。VIACODECLib_TLB ライブラリを使用して、次の関数を作成しました。
IViaFile インターフェイスから。この関数は、元のシーケンスからフレーム ビットマップへのハンドルを返すことになっています。次のコードが機能する可能性があります。
しかし、結果として得られるビットマップは、アルファ チャネルのない元のフレームです。実際には、そのアルファ チャネルは画像全体でゼロです。
何か間違ったことをしていると仮定して、GetDIBits 関数を使用して、アルファ チャネルがどこかにあることを確認しました。そのため、ビットマップに 4 つのチャネルがあり、GetDIBits 関数を使用すると仮定して、ビットマップを格納するのに十分な長さのメモリを割り当てました。以前と同じ結果が得られました。通常のフレーム、画像全体のアルファ チャンネル ゼロです。
Inscriber (そのフォーラムは終了しています) は、Via Builder が完全なアルファ版をサポートしていると主張しています。GetDIBits 関数を使用して C++ でフレームを正しくロードできた人を知っていますが、コードを Delphi に「変換」することはできませんでした。
どんな助けでも大歓迎です。
ありがとうございました。
c++ - Winsock、GetDIBits、および SetDiBits を使用したビットマップ転送
私は、C++ でリモート コントロール アプリケーションに似たものに取り組み始めました。特定のウィンドウのスクリーンショットを別の PC に転送し、ウィンドウに表示したいと考えています。GetDIBits と SetDIBits の両方の関数が成功し、接続が確立され、データが送信されますが、画像は反対側に表示されず、単に黒くなります。
これが私の送信コードです:
そして、ここに受信側があります:
ここで紹介するコードは少し長いですが、何が役に立つのかわからなかったからです。前もって感謝します。
c++ - GetDIBits と X、Y を使用してピクセルをループする
画面の一部をつかみ、特定の色範囲のピクセルをスキャンしています。
MSDN の Capturing an Image の例を見て、関数の使用方法を知っています。
ビットを配列に入れることはできますが、画像のようにループできるようにする方法がわかりません。疑似例(これはかなり外れていると確信しています):
それが基本的に私がやりたいことなので、赤、青、緑が特定の色である場合、画像の (x, y) の座標がわかります。
そのような方法で GetDIBits を使用する方法と、これを達成できるように配列を適切にセットアップする方法がわかりません。
gdi - GetDIBitsのHDCとは何ですか?
GetDIBits
画面互換のデバイスコンテキストから特定の形式のDIBにビットマップデータを取得するために使用していました。DCは、ソースビットマップが8ビット/ピクセル以下の場合にカラーテーブルを合成するためにのみ必要であるという印象を受けました。ソースビットマップはフル32ビットカラー画像であり、これは1回限りのプログラムであり、画面DCが手元になかったため、HDCパラメーターをNULLに設定しました。これはうまくいきませんでした。画面のDCを取得して渡すと、動作を開始しました。
そのため、なぜGetDIBits
デバイスコンテキストが必要なのか疑問に思いました。それは何のために使われますか?
bitmap - BITMAP::bmBits と GetDIBits の使用の違いは何ですか?
BITMAP
GDIにあることに気付きました。GetObject(hBmp, sizeof(BITMAP), &bmp);
ほとんどすべてのGetDIBits
例でそうしています。ただし、ここで新しく設定された bmp にはフィールドがあります。bmBits
ここにビットマップのビットが既にある場合、なぜGetDIBits
もう一度呼び出すのでしょうか?
ありがとう、アリ・ヴェリ
winapi - デバイスに依存しないビットマップ ビットが必要
VB プロジェクトにインポートする C++ で dll を構築しています。dll は、指定されたドキュメントのプレビュー イメージを Win Shell を介して抽出する関数を公開し、それを VB アプリが使用するバッファに書き込みます。
これまでのところ、問題なく HBITMAP ハンドルを取得できています。また、GetBitmapBits 関数を使用してビットマップ データを抽出することもできました。ただし、ビット データを必要とするオブジェクトはデバイスに依存しない形式である必要があるため、これは機能しません。
GetDiBits がこの目的に使用する関数であることを読みましたが、関数を正常に呼び出す方法を理解するのに苦労しています。
どのデバイス コンテキストを使用する必要がありますか? また、デバイスに依存しない形式でデータを書き出すにはどうすればよいですか?
前もって感謝します。
winapi - Windows GetDIBits 関数を使用してビットマップ ピクセル値を取得する
GetDIBits 関数を使用してビットマップのピクセルを取得しようとしています。私は Windows GDI/API について勉強したことがないので、最初の引数である HDC についてはよくわかりません。SO と Web で無数の投稿を検索しましたが、この特定のケースで HDC を初期化する方法に関する情報や例を見つけることができませんでした。ピクセル値をどこまで読んだかは次のとおりです。
解決:
ウェブをさらに精査した後、次のことをまとめることができました。
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 を解放しようとすると、アクセス違反が発生します。それは正常ですか、それともそれを解放する適切な方法はありますか?
c++ - GetDIBits を使用して画像のピクセル カラーにアクセスする
GetDIBits を使用して現在のウィンドウの色の内容を読み込むことができますが、ある場所から画像の色を読み込む方法がわかりません。誰かがそれを行う方法を教えてもらえますか?
この方法で色を配列にロードします
私は Windows プログラミングの初心者で、画像を hdc にロードする方法を知りたいだけです。
レイモンドが示唆したように、2番目のパラメーターを次のように渡しました
私はまだアクティブなウィンドウの色だけをキャプチャしており、画像はキャプチャしていません。それを反映するようにデバイスハンドルを変更するにはどうすればよいですか。