問題タブ [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# - Transparency Blend を使用して小さなビットマップを大きなビットマップにコピーする: graphics.DrawImage(smallBitmap, x , y) よりも高速なのは何ですか?
私は、この呼び出しが高圧機能のボトルネックであると特定しました。
小さな半透明のビットマップをより大きな半透明のビットマップにブレンドするより速い方法はありますか?
使用例:
DrawImage 呼び出しは小さな 32bppPArgb ビットマップを取得し、さまざまな場所でそれらを大きなビットマップにコピーします。小さなビットマップは、大きなビットマップの可視領域に部分的にしか重ならない場合があります。両方の画像には、出力にとって重要な方法で DrawImage によってブレンドされる半透明のコンテンツがあります。私は BitBlt でいくつかのテストを行いましたが、大幅な速度の向上は見られず、私のテストではアルファ ブレンディングが同じ結果になりませんでした。私は、bitblt や安全でない C# コードへのより適切な呼び出しを含む、ほぼすべてのメソッドに対してオープンです。
c# - 画面に直接描画するときに自分でクリーンアップする方法
BitBlt
と を使用して画面に直接描画していますGetDC(IntPtr.Zero)
。完了時に画面全体で Refresh または Invalidate を呼び出す方法はありますか?
更新: 私のように画面に直接描画すると、描画したものは、その下のウィンドウが再描画されるまでそこに残ります(そうすることで、それが覆っている画面の部分が再描画されます)。
問題は、Windows デスクトップの一部が長期間再描画されないことです。たとえば、タスク バーの上に描画すると、実際のタスクは ([スタート] ボタンなどと共に) かなりすばやく再描画されますが、タスク バー自体は描画した内容を数分間保持します。
アプリに画面全体をカバーするウィンドウがある場合、Invalidate()
そのフォームを呼び出すだけで、それ自体が再描画され、画面全体が再描画されます。私が必要としているのは、何らかの方法で呼び出すInvalidate
かRefresh
、画面全体で行うことです。
c# - GDI の DrawImage(Unscaled) よりもパフォーマンスを向上させる方法は?
ユーザー コントロールのペイント ハンドラーで、定義済みの Bitmap オブジェクトのコレクションを繰り返し処理し、クライアント領域に描画します。
C# バージョン:
VB.NET バージョン:
コードは問題なく動作しますが、12 個ほどのオブジェクトがコレクションに追加されると、動きが鈍くなり始めます。私の質問は: これをスピードアップする方法はありますか? Win32 の bitblt 関数を使用して DrawImageUnscaled を置き換えることはできますか? もしそうなら、どのように?
ありがとう!
注: BitBlt の使用に関するグーグル検索では、これまでのところ画面キャプチャのサンプルしか得られませんでした...
bitblt - SRCCOPYは、BITBLITTEDIMAGEから透明度を削除します
最初の2つのビットビットが透明性を作ることは知っていますが、3番目のビットビットはそれを取り除きます!私はここで何が間違っているのですか?
winapi - WinAPI/GDI: 大きなウィンドウのスナップショットにタスクバーが含まれるのはなぜですか?
GDI+ を使用してウィンドウのスナップショットを取得しています。コードは次のとおりです。
ここで、hDC は前に次のように設定されます。
これは小さなウィンドウでは完全に機能しますが、画面よりも大きなウィンドウを試してみました。
つまり、タスクバーも保存されています。何が与えますか?
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にあると思います。
BitmapInfoHeader.biBitCount=32またはBitmapInfoHeader.biBitCount=16ビットのどちらを使用するかわかりません。32だと思います。biCompression->BI_RGBまたはBI_BITFIELDSはどうですか?
UpdateLayeredWindowで動作するように、16ビットDCをメモリDCにBitBlt(...、SRCCOPY)した後、アルファチャネル情報をメモリDCに追加するにはどうすればよいですか?(たぶん:rgbチャネルをalphaチャネルで事前に乗算しますか?)Dunnoの方法。
16ビットデスクトップの色深度の問題に少し近づきました。
上記はうまくいくようです。しかし、UpdateLayeredWindow関数が生成する結果は乱雑に見えます。
だから、これは黒い色が欠けているからです!完全に黒だったすべてのピクセルが透明になります。透けてクリックすることもできます。他のすべてのピクセルは黒い部分を失い、クリックスルーするだけです。
テストを行いました。WindowsPaint.exeを開き、ウィンドウの幅と高さの表面を塗りつぶした色として黒にしました。
次に、それをレイヤードウィンドウ(黒色が欠落している)の下に置き、レイヤードウィンドウを再び元のウィンドウとして使用しました。ta-da、レイヤードウィンドウは、Paint.exeの黒いピクセルを通して輝くことと組み合わせて正常に見えます。
そのため、BitBltで期限切れになり、そのラスター操作パラメーターが再び有効になりました。しかし、運はありません。
UpdateLayeredWindowで描画する前に、BitBltを使用して黒色をDCにブレンドするにはどうすればよいですか?
qt - BitBlt in Qt4?
What is the recommended method of copying one QImage into another at a particular position in Qt4?
QImage::bitblt was removed in Qt4.
Does the QImage now need to be converted to a PixMap and back?
c++ - トリミング関数 BitBlt(...)
既存のエンジンでクロップ機能を作成したいと考えています。これは私がすでに持っているものです:
イメージ全体を新しい HBITMAP にコピーし、古いイメージを置き換えたいだけです。だから私はそれが機能することを知っています。その後は、BitBlt パラメーターをいじっているだけです。
m_Handle はクラス Bitmap の HBITMAP です。
このコードの結果は、単なる黒い画面です。
vb.net - BitBlt関数は、.NET2.0VBアプリでx86用にコンパイルされたときに空のビットマップを生成します
VBプロジェクトにBitBltラッパー関数があります。Any CPUとしてコンパイルすると問題なく動作しますが、x86を目指すと、空のビットマップが作成されます。アプリの他の部分で必要になるため、x86を使用する必要があります。何が間違っている可能性があるのか?コードは次のとおりです。
ありがとう、ブライアン
c - BitBltを使用してデスクトップピクセルの色をキャプチャする
現在、GetPixel()を使用して、デスクトップから約64ピクセルを取得し、それらの色を取得しています。GetPixel()が遅いことについて読みましたが、数ピクセルでは問題ないと思いましたが、ルーチンを実行するたびに1.5秒ほどかかります。いくつかの調査を行った後、bitbltは私が探しているもののようだと結論付けました。私がやりたいのは、デスクトップの定義された領域(すべてのウィンドウを含む)を取得してから、指定されたオフセットでピクセルの色を取得することです。これが私が今していることです:
}
かなりの量のチュートリアルとドキュメントを見つけましたが、Windows APIに慣れていないため、あまり効果がありません。ありがとう!