問題タブ [bitblt]

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 に答える
934 参照

c++ - GetDIBits は、イメージ バッファをすべて 0 (すべて黒) に設定します。

ウィンドウのスクリーンショットをビットマップとして撮ろうとしています。以下のコードは適切なサイズのビットマップを作成していますが、すべてのピクセルが黒です。つまり、GetDIBits は imageBuffer をすべて 0 に設定しています。

投稿されたコードは、開いて画面に表示されるすべてのメモ帳のビットマップを保存します。どのアサートも失敗しません。

BITMAPFILEHEADER とファイルへの実際の書き込みは省略されます。これは、アサートを含む最後の for ループで、GetDIBits が imageBuffer をすべて 0 に設定していることを示しているため、それ以降のコードを調べる必要がないためです。

(実行可能ファイルのプロパティで、[構成プロパティ] -> [全般] の下で、Unicode の必要性を避けるために、文字セットを「設定しない」に設定しています。)

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

winforms - PrintScreen の内容が表示よりも大きい

これのスクリーンショットを喜んで提供しますが、問題は、キャプチャされた画像が実際のデスクトップよりもはるかに大きいことです。

デスクトップ hdc と新しい「グラフィックス」コマンドで BitBlt を使用しようとしたので、これに完全に不満を感じています。

私の実際のデスクトップ解像度は 1920x1080 - 1080p です。

BitBlt と "Graphics" は両方とも、解像度が 1536x864 @ 96 DPI であることを返します。

フォーム (WinForm)、最大化、ボーダレス、およびフォームが設​​定されているスケーリング モードに関係なく、1536x864 @ 96 DPI も表示されます。

キャプチャされた画像は、1920x1080 から行われているようですが、スクリーンショットとして 1536x864 の領域を切り取っています。

Prtscn ボタンを使用して PrintScreen を直接実行すると、画像全体が表示されますが、それでも実際に表示されるサイズよりも約 1.5 ~ 2 倍大きくなります。

私が探しているのは、スケール/dpi/ここで起こっていることは何でも、視覚的にどのように見えるかで、画面に表示されているものの写真を撮る方法の解決策です。私はスクリーン キャプチャ プログラムを作成し、RubberBand フォーム (ボックスを描画して画面の領域を選択するためのオーバーレイ フォーム) のいくつかの異なる例を使用しました。オフセットされ、コンテンツがズームされます。

これは非常に面倒です - 説明するだけでも、あなたのほとんどが私が使用する用語に精通しており、スクリーンショットを撮ることで何を期待できるかを知っていると確信しています.は。

例/考察

300x300 のウィンドウの写真を撮り、その左上の 150x150 を 300x300 にズームして、ウィンドウの残りの部分を完全にスキップすることを想像してみてください。結果の画像は 300x300 のままですが、選択したものではありません。

ここで、プログラムで取得できる唯一の寸法で画面の画像を取得し、その画像を画像ボックスに入れると想像してください。画面とピクチャボックスの両方が同じ寸法と dpi であると主張していても、ピクチャボックスが境界線のないボーダーレスでフルスクリーンに最大化されている場合でも、ピクチャボックス内の画像をスクロールする必要があります。しかし、フォームXDと同じサイズであることをまだどのように報告していますか(GraphicsまたはBitBltの寸法を実際のフォームと比較します。また、pictureboxの内容を比較してみましたが、それでも同じ効果です)

これはまさに、起こっている効果です。画面の領域またはセグメントをキャプチャしようとしたとき。Windows api/crl がこの一見些細なことについて嘘をついている理由はわかりませんが、すべての解像度で、この偽のズーム効果なしでスクリーンショット/キャプチャ領域を正確に取得する方法が必要です。

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

c++ - Office 2013 で BitBlt が機能しない

BitBlt を使用して、ユーザーのデスクトップ上のウィンドウのスクリーンショットを取得しています。ほとんどのプログラムのウィンドウですべてがうまく機能することがわかりました。ただし、BitBlt は Office 2013 ウィンドウ (Word、Powerpoint など) に対して空白のピクセルを返します。

PrintWindow はこれらの Office 2013 ウィンドウで機能しますが、プロセッサのオーバーヘッドが高くなります。可能であれば、BitBlt を使用したいと思います。

BitBlt が Office 2013 ウィンドウで動作しない理由はありますか?

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

ありがとう

更新: BitBlt(...) は true を返します。appWin ではなくデスクトップ全体をキャプチャするようにコードを変更すると、Office 2013 ウィンドウが正しくキャプチャされます。この投稿を参照してください。デスクトップ全体をキャプチャして、目的のウィンドウを抽出できます。ただし、これは、ソフトウェアがフォアグラウンドにないウィンドウから画像をキャプチャできるようにする新しい DWM で 1 つの優れた機能を失います。

システムがOffice 2013タイプのウィンドウをキャプチャし、フォアグラウンドにないウィンドウから画像をキャプチャできるようにする、これを行うためのより良い方法はありますか?

更新 2: appWin で BitBlt を実行すると、最初の BitBlt は有効なピクセル データを提供するように見えますが、後続の BitBlt は空白のピクセルを提供します。理由は不明ですが、重要なデータ ポイントである可能性があります。

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

winapi - RGBA を取得する BITMAPV5HEADER は A を 255 に保ちます

次のようにしてスクリーンショットのバイト配列を取得しています。これは ctypes で行われます。ctypes に問題はありません。これに ctypes タグを付けると、ctypes の人々は混乱するので、すべてのエラー チェックなどを簡略化しました。手順を表示します。

したがって、上記のフラグを使用すると、次のような BGRA byteArr が得られます。

B は 240、G は 200、R は 105、A は 255 です。

これを RGBA 形式にしたい (ctypes のパフォーマンス上の理由から、C 側で行うことが重要です)。

したがって、これらのマスクを使用して、A が 0 になっても、RGBA 形式に正常に変換できます。

これにより、次のことがわかります。

問題は、A 値が 0 になることです。この RGBA 形式を維持しながら、A 値を 255 に維持するにはどうすればよいでしょうか。

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

c++ - BitBlt メモリリーク

ボタンにビットマップを表示するために BitBlt を使用しています。ほとんどの場合は問題ありませんが、しばらくするとプログラムがクラッシュする原因となるメモリ リークが発生します。私はこれで何が間違っていますか?

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

c++ - Qt: Qt5 Windows の BitBlt の代替

現在、オープンソース ソリューション (Albatross ATM ソリューションhttp://www.albatross.aero/ ) を Qt3 から Qt5 に移植しています。Albatross は、非常に優れたパフォーマンスを必要とする航空交通ビューアーです。私は管理できましたが、表示部分ではないさまざまな問題があります。

表示アーキテクチャは、bitblt最初にピックスマップを別のピックスマップにコピーし、最後にピックスマップを画面にコピーするコマンドに基づいています。

これがQt3ディスプレイコードです(動作およびパフォーマンス)

に置き換えてみましbitbltdrawPixmapが、画面を頻繁に表示する必要があるため、パフォーマンスが非常に悪いです。

新しい Qt5 コードは次のとおりです。

  • レイヤーには、3 つのレイヤーがあります。レイヤ 0 が最も深く (背景)、レイヤ 2 が最も高くなります。この設定は、航空交通が常に画面の一番上に表示されるようにするために使用されます。

  • OnDraw メソッドは、レイヤに応じて、最後の paintEvent 以降に変更された要素を描画します

paintEventQ: Qt5 で良好な動作を取り戻し、再び良好なパフォーマンスを得るために、この方法を改善する方法について何か考えはありますか?

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

c++ - C++ でディスクに保存せずにスクリーン キャプチャを使用する

画面から画像をキャプチャしようとしています。現在、スクリーンショットを撮ってディスクに保存するコードがありますが、毎回保存したくありません。オンラインで他の例を数時間読んだ後でも、このプロセスがどのように機能するかを理解していないと感じています.

2 つの目標は、メモリ内に画面を作成して別の関数に渡すことと、(x,y) 座標を指定して画面の選択した部分のみをキャプチャできるようにすることです。

私はコーディングに比較的慣れていないので、これが些細なことであれば驚くことではありませんが、それでも説明をいただければ幸いです。

これは、オンラインで見つけて作業しているサンプルコードです。