問題タブ [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 に答える
1356 参照

c# - Transparency Blend を使用して小さなビットマップを大きなビットマップにコピーする: graphics.DrawImage(smallBitmap, x , y) よりも高速なのは何ですか?

私は、この呼び出しが高圧機能のボトルネックであると特定しました。

小さな半透明のビットマップをより大きな半透明のビットマップにブレンドするより速い方法はありますか?

使用例:

DrawImage 呼び出しは小さな 32bppPArgb ビットマップを取得し、さまざまな場所でそれらを大きなビットマップにコピーします。小さなビットマップは、大きなビットマップの可視領域に部分的にしか重ならない場合があります。両方の画像には、出力にとって重要な方法で DrawImage によってブレンドされる半透明のコンテンツがあります。私は BitBlt でいくつかのテストを行いましたが、大幅な速度の向上は見られず、私のテストではアルファ ブレンディングが同じ結果になりませんでした。私は、bitblt や安全でない C# コードへのより適切な呼び出しを含む、ほぼすべてのメソッドに対してオープンです。

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

c# - 画面に直接描画するときに自分でクリーンアップする方法

BitBltと を使用して画面に直接描画していますGetDC(IntPtr.Zero)。完了時に画面全体で Refresh または Invalidate を呼び出す方法はありますか?

更新: 私のように画面に直接描画すると、描画したものは、その下のウィンドウが再描画されるまでそこに残ります(そうすることで、それが覆っている画面の部分が再描画されます)。

問題は、Windows デスクトップの一部が長期間再描画されないことです。たとえば、タスク バーの上に描画すると、実際のタスクは ([スタート] ボタンなどと共に) かなりすばやく再描画されますが、タスク バー自体は描画した内容を数分間保持します。

アプリに画面全体をカバーするウィンドウがある場合、Invalidate()そのフォームを呼び出すだけで、それ自体が再描画され、画面全体が再描画されます。私が必要としているのは、何らかの方法で呼び出すInvalidateRefresh、画面全体で行うことです。

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

c# - GDI の DrawImage(Unscaled) よりもパフォーマンスを向上させる方法は?

ユーザー コントロールのペイント ハンドラーで、定義済みの Bitmap オブジェクトのコレクションを繰り返し処理し、クライアント領域に描画します。

C# バージョン:

VB.NET バージョン:

コードは問題なく動作しますが、12 個ほどのオブジェクトがコレクションに追加されると、動きが鈍くなり始めます。私の質問は: これをスピードアップする方法はありますか? Win32 の bitblt 関数を使用して DrawImageUnscaled を置き換えることはできますか? もしそうなら、どのように?

ありがとう!

注: BitBlt の使用に関するグーグル検索では、これまでのところ画面キャプチャのサンプルしか得られませんでした...

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

bitblt - SRCCOPYは、BITBLITTEDIMAGEから透明度を削除します

最初の2つのビットビットが透明性を作ることは知っていますが、3番目のビットビットはそれを取り除きます!私はここで何が間違っているのですか?

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

winapi - WinAPI/GDI: 大きなウィンドウのスナップショットにタスクバーが含まれるのはなぜですか?

GDI+ を使用してウィンドウのスナップショットを取得しています。コードは次のとおりです。

ここで、hDC は前に次のように設定されます。

これは小さなウィンドウでは完全に機能しますが、画面よりも大きなウィンドウを試してみました。

つまり、タスクバーも保存されています。何が与えますか?

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

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にあると思います。

  1. BitmapInfoHeader.biBitCount=32またはBitmapInfoHeader.biBitCount=16ビットのどちらを使用するかわかりません。32だと思います。biCompression->BI_RGBまたはBI_BITFIELDSはどうですか?

  2. UpdateLayeredWindowで動作するように、16ビットDCをメモリDCにBitBlt(...、SRCCOPY)した後、アルファチャネル情報をメモリDCに追加するにはどうすればよいですか?(たぶん:rgbチャネルをalphaチャネルで事前に乗算しますか?)Dunnoの方法。


16ビットデスクトップの色深度の問題に少し近づきました。

上記はうまくいくようです。しかし、UpdateLayeredWindow関数が生成する結果は乱雑に見えます。

だから、これは黒い色が欠けているからです!完全に黒だったすべてのピクセルが透明になります。透けてクリックすることもできます。他のすべてのピクセルは黒い部分を失い、クリックスルーするだけです。

テストを行いました。WindowsPaint.exeを開き、ウィンドウの幅と高さの表面を塗りつぶした色として黒にしました。

次に、それをレイヤードウィンドウ(黒色が欠落している)の下に置き、レイヤードウィンドウを再び元のウィンドウとして使用しました。ta-da、レイヤードウィンドウは、Paint.exeの黒いピクセルを通して輝くことと組み合わせて正常に見えます。

そのため、BitBltで期限切れになり、そのラスター操作パラメーターが再び有効になりました。しかし、運はありません。

UpdateLayeredWindowで描画する前に、BitBltを使用して黒色をDCにブレンドするにはどうすればよいですか?

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

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?

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

c++ - トリミング関数 BitBlt(...)

既存のエンジンでクロップ機能を作成したいと考えています。これは私がすでに持っているものです:

イメージ全体を新しい HBITMAP にコピーし、古いイメージを置き換えたいだけです。だから私はそれが機能することを知っています。その後は、BitBlt パラメーターをいじっているだけです。

m_Handle はクラス Bitmap の HBITMAP です。

このコードの結果は、単なる黒い画面です。

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

vb.net - BitBlt関数は、.NET2.0VBアプリでx86用にコンパイルされたときに空のビットマップを生成します

VBプロジェクトにBitBltラッパー関数があります。Any CPUとしてコンパイルすると問題なく動作しますが、x86を目指すと、空のビットマップが作成されます。アプリの他の部分で必要になるため、x86を使用する必要があります。何が間違っている可能性があるのか​​?コードは次のとおりです。

ありがとう、ブライアン

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

c - BitBltを使用してデスクトップピクセルの色をキャプチャする

現在、GetPixel()を使用して、デスクトップから約64ピクセルを取得し、それらの色を取得しています。GetPixel()が遅いことについて読みましたが、数ピクセルでは問題ないと思いましたが、ルーチンを実行するたびに1.5秒ほどかかります。いくつかの調査を行った後、bitbltは私が探しているもののようだと結論付けました。私がやりたいのは、デスクトップの定義された領域(すべてのウィンドウを含む)を取得してから、指定されたオフセットでピクセルの色を取得することです。これが私が今していることです:

}

かなりの量のチュートリアルとドキュメントを見つけましたが、Windows APIに慣れていないため、あまり効果がありません。ありがとう!