問題タブ [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.
c++ - C++ MFC: ビットマップを CFrame に描画する
ウィンドウにビットマップ (バイト配列として格納) を描画しようとしています。
一般的な手順は次のとおりです。
OnPaint() ハンドラーでデバイス コンテキストを取得します。
そこから互換性のあるデバイス コンテキストを作成し、
クライアント領域のサイズの互換ビットマップを作成します ( GetClientRect(&WinRect)
)。
ここで、ウィンドウ クライアントのサイズがビットマップとまったく同じサイズである場合はpNewBitmap->SetBitmapBits
、配列をビットマップに "フィード" するために を呼び出すだけです。
これに aBitBlt
を続けると、ウィンドウにビットマップが表示されます。
ウィンドウ サイズを画像サイズとは無関係に変化させたい場合は、最初pNewBitmap
に適切なサイズ (クライアントの四角形) であることを確認する必要がありますが、配列をビットマップに単純に押し込むことはできません。
この状況では、上記の手順を繰り返して画像の正確なサイズのビットマップを作成することで解決策を見つけたので、ビットをその中に「押し込む」ことができBitBlt
ます。BitBlt
窓に向かった。
これを行う別の方法はありますか?実際のコードは次のとおりです。
performance - 非常に大きなビットマップからの Delphi の遅い bitblt
ドラッグ&ドロップでテーブルをデザインできるコンポーネントを作成しています。
ドラッグ&ドロップ部分とテーブルレンダリング部分はなんとか書けたのですが、問題があります。
私はダブル バッファリングを使用してちらつきを減らし、メモリ内のビットマップに描画し、その一部を画面に bitblt します。
手順:
- テーブルをメモリ内ビットマップに描画します (これは非常に大きくなる可能性があり、最大値まで)。
- コントロール キャンバス上の部分的なインメモリ ビットマップ コンテンツ。
問題は、メモリ内のビットマップが大きくなるほど、bitblt 操作が (明らかに) 遅くなることです。
私の質問は:
- これのパフォーマンスを改善するにはどうすればよいですか?代替ソリューションにも興味があります。
コード:
アップデート:
コードと質問から「トリプル バッファリング」と UpdateScrollBars を削除しました。
c++ - MFC BitBlt および SetDIBits と SetBitmapBits の比較
バイトの BGRA 配列として格納されたビットマップがあります。これは、ビットマップを描画するために使用してきたコードです。
配列内のピクセルの実際のコピーは、次のように行わtranslatedImage
れます。
次に、さらに処理を行った後、ソース CDC として呼び出しpDC->StretchBlt
ますdispDC
。ディスプレイも 32bpp に設定されているため、ローカルにログインすると問題なく動作します。
リモート デスクトップでログインすると、ディスプレイが 16bpp になり、画像が乱れます。犯人はSetBitmapBits
; translatedImage
つまり、それが機能するためには、表示したいものの 16bpp バージョンを適切に入力する必要があります。これを自分で行うのではなく、ドキュメントを検索して、SetDIBits
私が望むように聞こえるものを見つけました。
SetDIBits 関数は、指定された DIB で見つかったカラー データを使用して、互換ビットマップ (DDB) にピクセルを設定します。
私の場合、DIB は 32bpp RGBA 配列で、DDB はdispBMP
で作成したものCreateCompatibleBitmap
です。
への呼び出しの代わりにSetBitmapBits
、これが私がしたことです:
ただし、r
常にゼロであり、当然、ウィンドウには何も表示されません。コードの何が問題になっていますか?
vb.net - VB.NET から PNG を保存すると影が乱れる
私は、.NET (すべてのバージョン) が真の透過性をネイティブにサポートしていないという古くからの問題に取り組もうとしてきました.コントロールが表示されないフォーム全体を使用してこれを行うことができます ( http://www.codeproject.com/Articles/1822/Per-Pixel-Alpha-Blend-in-Cを参照)
私はこの検索を部分的にあきらめ、代わりに、各グラフィック/テキストがフォームに直接描画される MDIParent/クライアントの状況を使用することで満足することにしました。
私がこれで抱えている問題は、透明度を使用して保存すると、PNGがより低い解像度で保存されているか、アルファチャンネルが失われていると私が信じている(しかし確信が持てない)影の周りにブロブができてしまうことですまたは何か、MakeTransparent(Insert Color Here) に満足していないだけです。このプロセスがどこでひどく間違っているのかを示すことができれば...見せてください。
入力画像
出力画像
私が使用しているコードは次のとおりです。
さらに、最初の画像の文字が出力で透明にレンダリングされていないことに気付くでしょう。
c++ - C++ Windows で何百回も繰り返した後にスクリーン キャプチャが失敗する: メモリ リーク?
BitBlt
メソッドを使用して画面をキャプチャし、 HBITMAP
.
ここでは、関数はピクセル配列の最初の値のみを返します。
実際、それはうまく機能します。
しかし、これをループしようとすると、数百ラウンド (私の場合は 900 を少し超える) 後にエラーが生成されAccess violation reading location
ます。
width
また、 と の値を減らすとheight
、エラーの呼び出しに時間がかかることにも気付きました。
私は真の初心者で、どこでエラーが発生するかわかりませんが、メモリの問題のように見えますよね?
c++ - CImage オブジェクトのディープ コピーによりデバッグ アサーションが失敗する
次のような問題があります: CImage オブジェクトをコピーするには? CImage オブジェクトのディープ コピーを作成する必要があります。特定の問題は、PostMessage を介してセカンダリ スレッドから CImage* を取得していて、それを別のクラスの属性である CImage オブジェクトにコピーしたいことです。
私は現在、次のコードを持っています:
obrazek->GetDC() と obrazek->ReleaseDC() に何か問題があると思われます。obrazek->GetDC() がある場合はエラーはありません (ただし、そうでない場合は、obrazek->BitBlt(...); でデバッグ アサーションが失敗します)。そうしないとメモリリークが発生するので、やりたいと思います。
そのため、一般的に、オブジェクトのコピーについて私が知らないことがあります。
編集:
他のスレッドは、次の方法で CImage を処理します。
さらに、画像を使用してdllで何が起こっているか:
c++ - SetPixel と BitBlt
私は何を間違っていますか?デバイス コンテキストで黒い線を描画し、それを C++ の MFC アプリケーションにブリットしたい:
python - モニターなしで実行している Windows マシンでスクリーンショットを撮ることはできますか?
リモート接続する仮想マシン (実行中の Windows) のバンクがあります。そのため、これらのマシンにはモニターが接続されておらず、リモート デスクトップによってのみアクセスされます。
デスクトップで実行中のアプリケーションのスクリーンショットを取得したいと考えています。私が見つけたのは、リモート デスクトップ経由で接続していない場合、画面がレンダリングされず、画面をキャプチャできないことです (私が管理した最善の方法は、黒い画像を取得することです)。
画面グラブのためにデスクトップを強制的にレンダリングする方法はありますか?
編集:より具体的には、マシンにリモート接続されている場合にスクリーンショットを取得する Python コードを次に示します。
リモートでこれを実行すると、正常に動作します。リモート接続していないとすぐに、次のエラーが表示されます。
win32ui.error: BitBlt に失敗しました
このエラーは、誰もリモート接続されていないときに画面がレンダリングされないことが原因です。
リモートデスクトップ経由で接続していないときに、このシナリオでスクリーンショットを取得できるソリューションが必要です。
編集 2: 明確にするために、コードは VM 自体で実行されています。しかし、誰もマシンにリモート接続されていないときに実行されています。