問題タブ [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.

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

c++ - C++/Win32: HBITMAP からアルファ チャネルを取得する方法は?

HBITMAPアルファチャンネルデータを含んでいます。::AlphaBlendGDI 関数を使用してこれを正常にレンダリングできます。

しかし、::GetPixelGDI 関数を呼び出すと、アルファ コンポーネントを含む値が返されません。ドキュメントには、ピクセルの RGB 値を返すと書かれています。

のピクセルのアルファ チャネル値を取得する方法はありますHBITMAPか?

::AlphaBlend を使用するタイミングと、ソース HBITMAP 内の特定の色を透明として扱う昔ながらの方法を使用するタイミングを検出できるようにしたいと考えています。



答え

GetDIBits を使用して、イメージの最初 (またはそれ以上) のスキャン ラインを取得します。

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

delphi - Builder と Delphi による Inscriber テクノロジー - アルファ チャネルのサポート

Inscriber Technology の Via Builder を使用しています。このアプリは、TGA シーケンス アニメーションを 1 つの .via ファイルにマージし、このファイルが最適化されているため、大きなシーケンスをロードする方がはるかに優れています。一部のアドビ製品でこれを使用するためのプラグインがあります。

私は Delphi に取り組んでいますが、私の問題は、フレームから元のアルファ チャネルを取り戻せないことです。VIACODECLib_TLB ライブラリを使用して、次の関数を作成しました。

IViaFile インターフェイスから。この関数は、元のシーケンスからフレーム ビットマップへのハンドルを返すことになっています。次のコードが機能する可能性があります。

しかし、結果として得られるビットマップは、アルファ チャネルのない元のフレームです。実際には、そのアルファ チャネルは画像全体でゼロです。

何か間違ったことをしていると仮定して、GetDIBits 関数を使用して、アルファ チャネルがどこかにあることを確認しました。そのため、ビットマップに 4 つのチャネルがあり、GetDIBits 関数を使用すると仮定して、ビットマップを格納するのに十分な長さのメモリを割り当てました。以前と同じ結果が得られました。通常のフレーム、画像全体のアルファ チャンネル ゼロです。

Inscriber (そのフォーラムは終了しています) は、Via Builder が完全なアルファ版をサポートしていると主張しています。GetDIBits 関数を使用して C++ でフレームを正しくロードできた人を知っていますが、コードを Delphi に「変換」することはできませんでした。

どんな助けでも大歓迎です。

ありがとうございました。

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

c++ - Winsock、GetDIBits、および SetDiBits を使用したビットマップ転送

私は、C++ でリモート コントロール アプリケーションに似たものに取り組み始めました。特定のウィンドウのスクリーンショットを別の PC に転送し、ウィンドウに表示したいと考えています。GetDIBits と SetDIBits の両方の関数が成功し、接続が確立され、データが送信されますが、画像は反対側に表示されず、単に黒くなります。

これが私の送信コードです:

そして、ここに受信側があります:

ここで紹介するコードは少し長いですが、何が役に立つのかわからなかったからです。前もって感謝します。

0 投票する
5 に答える
20454 参照

c++ - GetDIBits と X、Y を使用してピクセルをループする

画面の一部をつかみ、特定の色範囲のピクセルをスキャンしています。

MSDN の Capturing an Image の例を見て、関数の使用方法を知っています。

ビットを配列に入れることはできますが、画像のようにループできるようにする方法がわかりません。疑似例(これはかなり外れていると確信しています):

それが基本的に私がやりたいことなので、赤、青、緑が特定の色である場合、画像の (x, y) の座標がわかります。

そのような方法で GetDIBits を使用する方法と、これを達成できるように配列を適切にセットアップする方法がわかりません。

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

gdi - GetDIBitsのHDCとは何ですか?

GetDIBits画面互換のデバイスコンテキストから特定の形式のDIBにビットマップデータを取得するために使用していました。DCは、ソースビットマップが8ビット/ピクセル以下の場合にカラーテーブルを合成するためにのみ必要であるという印象を受けました。ソースビットマップはフル32ビットカラー画像であり、これは1回限りのプログラムであり、画面DCが手元になかったため、HDCパラメーターをNULLに設定しました。これはうまくいきませんでした。画面のDCを取得して渡すと、動作を開始しました。

そのため、なぜGetDIBitsデバイスコンテキストが必要なのか疑問に思いました。それは何のために使われますか?

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

bitmap - BITMAP::bmBits と GetDIBits の使用の違いは何ですか?

BITMAPGDIにあることに気付きました。GetObject(hBmp, sizeof(BITMAP), &bmp);ほとんどすべてのGetDIBits例でそうしています。ただし、ここで新しく設定された bmp にはフィールドがあります。bmBits

ここにビットマップのビットが既にある場合、なぜGetDIBitsもう一度呼び出すのでしょうか?

ありがとう、アリ・ヴェリ

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

winapi - デバイスに依存しないビットマップ ビットが必要

VB プロジェクトにインポートする C++ で dll を構築しています。dll は、指定されたドキュメントのプレビュー イメージを Win Shell を介して抽出する関数を公開し、それを VB アプリが使用するバッファに書き込みます。

これまでのところ、問題なく HBITMAP ハンドルを取得できています。また、GetBitmapBits 関数を使用してビットマップ データを抽出することもできました。ただし、ビット データを必要とするオブジェクトはデバイスに依存しない形式である必要があるため、これは機能しません。

GetDiBits がこの目的に使用する関数であることを読みましたが、関数を正常に呼び出す方法を理解するのに苦労しています。

どのデバイス コンテキストを使用する必要がありますか? また、デバイスに依存しない形式でデータを書き出すにはどうすればよいですか?

前もって感謝します。

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

winapi - Windows GetDIBits 関数を使用してビットマップ ピクセル値を取得する

GetDIBits 関数を使用してビットマップのピクセルを取得しようとしています。私は Windows GDI/API について勉強したことがないので、最初の引数である HDC についてはよくわかりません。SO と Web で無数の投稿を検索しましたが、この特定のケースで 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 に答える
915 参照

c++ - GetDIBits を使用して画像のピクセル カラーにアクセスする

GetDIBits を使用して現在のウィンドウの色の内容を読み込むことができますが、ある場所から画像の色を読み込む方法がわかりません。誰かがそれを行う方法を教えてもらえますか?

この方法で色を配列にロードします

私は Windows プログラミングの初心者で、画像を hdc にロードする方法を知りたいだけです。

レイモンドが示唆したように、2番目のパラメーターを次のように渡しました

私はまだアクティブなウィンドウの色だけをキャプチャしており、画像はキャプチャしていません。それを反映するようにデバイスハンドルを変更するにはどうすればよいですか。