問題タブ [hbitmap]
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.
gdi+ - GetHBITMAP メソッドの使用方法
gdi+ ビットマップがあり、ビットマップを HBitmap に変換したいと考えています。次のコードを書きます。
しかし、うまくいきません。どうすれば HBitmap を取得できますか?
c++ - C++/Win32: HBITMAP からアルファ チャネルを取得する方法は?
HBITMAP
アルファチャンネルデータを含んでいます。::AlphaBlend
GDI 関数を使用してこれを正常にレンダリングできます。
しかし、::GetPixel
GDI 関数を呼び出すと、アルファ コンポーネントを含む値が返されません。ドキュメントには、ピクセルの RGB 値を返すと書かれています。
のピクセルのアルファ チャネル値を取得する方法はありますHBITMAP
か?
::AlphaBlend を使用するタイミングと、ソース HBITMAP 内の特定の色を透明として扱う昔ながらの方法を使用するタイミングを検出できるようにしたいと考えています。
答え
GetDIBits を使用して、イメージの最初 (またはそれ以上) のスキャン ラインを取得します。
gdi+ - GDI+ から GDI への変換に関する奇妙な問題: Bitmap と HBitmap
gdi+ Bitmap を gdi オブジェクト HBitmap に変換したい。
私は次の方法を使用しています:
img オブジェクトがダイアログに描画されています。メソッドのこの部分が呼び出されると、奇妙なことが起こります! ウィンドウに表示される画像が変わりました!少しクリアまたはシャープになります。私の質問は、何が起こるのですか?
c++ - C++ での HBITMAP から Jpeg または Png への変換
HBITMAP変数を使用してpngまたはjpegファイルを書き込む方法を知っている人はいますか?
私は最初にGDI +でこれを行うことを検討しましたが、最小/最大が定義されていないことを示すエラーが表示されます(それらを定義すると、さらに問題が発生します)。次に、libpngのC ++バインディング(png ++)を調べましたが、サンプルを取得できませんでしたコンパイル。
ありがとう、
マイキー
c++ - win32でツールバーボタンのビットマップを変更するには?
ウィンドウ内で ReBar を使用して、いくつかのコントロールを含むツールバーを作成しました。誰か教えてください
- ボタン/コンボボックス/その他(ウィンドウ内の通常のボタンではない)のIDを(のみ)知っている場合、そのHWNDを取得するにはどうすればよいですか?
- リソースの ID がわかっている場合に HBITMAP を取得するにはどうすればよいですか?
コントローラにビットマップを設定するには?
SendDlgItemMessageW(hWnd, nId, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);
これはツールバーでは機能しませんね。私はそれを行う方法を見つけることができませんでした、私を助けてください。ありがとうございました...
よろしく
編集:誰かお願いしますか?:(
編集:わかりました。最近はみんな忙しいようです。:(ところで、それは間違った質問ですか?
c# - C#でHBITMAPハンドルを使用して、リモートビットマップを取得します
シリアル化して(データベースに)保存する必要があるMarshalByRefObject
ものがあるので、後で逆シリアル化して参照することができます。私はこれに別の方法でアプローチすることを選択しました。現在、単に「生きている」状態を維持するWindowsサービスを実行しています(これは実際にはサードパーティのオブジェクトであり、自分で作成したものではないことにMarshalByRefObjects
注意してください)。RemoteObject
別のAppDomainでは、オブジェクトを接続して取得するだけです。すべて正常に動作します:
ここで問題となるのは、が型にキャストされたRemoteObject
単なるHBITMAP
ハンドルであるプロパティを含んでいることlong
です。ハンドルを簡単に取り出せます。通常(ローカルで)私はします:
現在の場合、これは機能しません。問題は、ローカルのAppDomainには存在しないが、WindowsサービスのAppDomainには存在しないメモリへのハンドルであるSystem.Runtime.InteropServices.ExternalException
と思います。hbitmap
私の質問は私のオプションが何であるかです:
- これ
RemoteObject
はかなり複雑で、関数を呼び出してノードをトラバースするツリーのようなものです。サードパーティは、オブジェクトを1回しかトラバースできないことを強制します。したがって、サービス側でトラバースし、データベースにビットマップを格納し、リモートで再度トラバースすることは機能しません。 - 理想的なのは、Windowsサービスで関数を呼び出し、hbitmapハンドルを引数として渡して、実際のビットマップを返すことができることです。これは、Windowsサービスでは不可能です。
- ハンドルをデータベースに保存し、Windowsサービスでデータベースをポーリングすることができます。次に、ビットマップを取得して、同じDBに保存できます。その後、そのビットマップをリモートで再度取得できます。ビットマップがすぐに必要なので、これは非常に醜いです。
基本的に、3番目のオプションのような醜いハックを実行する必要がないという提案があるかどうか知りたいです...私のオプションは何ですか?
解決済み現在、サービス側でMarshalByRefObjectを拡張するカスタムオブジェクトを作成することで問題を解決しました。このオブジェクトには、ハンドルを渡すことによってビットマップを取得して保存するメソッドがあります。サードパーティのオブジェクトにアプローチするのと同じ方法で、オブジェクトにリモートでアプローチするだけです。同僚がそれを指摘しなければならなかったが、解決策は単純すぎる。
c++ - HBITMAP が反転する理由
特定のjpg画像のaviファイルを作成しようとしています。ライブラリを使用してjpgを読み込んでおり、hbitmapを準備しています。最後に、aviファイルを作成するために追加しています。しかし、最終的な avi ファイルには反転した画像が含まれています。bitmapheader の hight を負のままにしました。それでも私のhbitmapは反転しています。エラーの理由を教えてください
ここで私は私が実装したコードを与えています
前もって感謝します
c++ - 別のプロセスで作成されたHBITMAPオブジェクトを削除できますか?
グローバルフックを使用して、デスクトップ上の他のウィンドウにいくつかの(ユーザーがカスタマイズ可能な)アイコンを描画するユーティリティプログラムを作成しています。ビットマップオブジェクトはプロセスに固有であるため、描画する前に、プロセスごとにこれらのアイコン用に個別のHBITMAPオブジェクトを作成し、これらのハンドルはすべてdllの共有セグメントに格納されます。
これで、プログラムでアイコンが(ユーザーによって)削除されたときに、これらのさまざまなプロセスでのアイコンのすべてのHBITMAPオブジェクトを削除する必要があります。メインプログラムでDeleteObject()を使用してこれを行うことはできますか、それとも作成されたプロセスで各ハンドルを削除する必要がありますか?
c++ - メモリバッファからのHBITMAPの作成
さまざまなビットマップやアイコンのpng形式または生のバイナリデータを表すことができるデータベースからいくつかのblobデータをロードするアプリケーションがあります。これはに保存されていますstd::vector<unsigned char>
オブジェクトを使用CImageList
してツリービューやツールバー画像などにさまざまな画像を表示していますが、問題は、メモリ内のデータからビットマップを作成すると、次のような操作を行うとピクセルが欠落しているようにぼやけてしまうことです。
今のところこの問題を回避するために、ベクター内のdata()を一時ファイルに書き出し、LoadImageを使用してそれを読み戻し、そこからHBITMAPを作成しています。これは完全に機能しますが、それは確かに恥知らずなハックであり、私が望むのは完全に不要なはずです。
私はオンラインで調べましたが、メモリからhbitmapを「適切に」作成する方法の本当に良い例は見つかりませんでした。これらのビットマップを作成して、ファイルI / Oを使用せずに、可能であればデータを限られた量だけコピーして、画像リストに追加できるようにしたいと思います。
これを行うための最良の方法を探しており、明らかにWindows固有のコードで問題ありません。
アップデート:
jdvの回答に基づいて、CreateCompatibleBitmap、CreateDIBitmap、そして最後にCreateDIBSectionで遊び始めました。これらはすべて、以前のファジービットマップの代わりに素敵な黒いビットマップを作成することになったので、もう一度何か間違ったことをしなければなりません。このビットマップの作成は、スクリーンDCまたはウィンドウの概念を持たないオブジェクトで行われているためですGetDC(NULL)
。CreateCompatibleDC(NULL)
良くないです。サンプルコード:
もちろん、HBITMAPを完全に回避し、CBitmap
クラスと直接連携することで、これを回避するためのより簡単な方法が必要だと今は考えています。とにかくCImageList
私が使用している画像を追加することになると。CBitmap::FromHandle(HBITMAP hbitmap, COLORREF mask)
誰かがCBitmap
からオブジェクトを初期化する簡単な方法を知っていstd::vector<unsigned char>
ますか?
c# - アルファ チャネル/透明度を維持しながら、C# でネイティブ HBitmap を使用する
ネイティブ Windows 関数から HBITMAP オブジェクト/ハンドルを取得するとします。Bitmap.FromHbitmap(nativeHBitmap)を使用してマネージド ビットマップに変換できますが、ネイティブ イメージに透明度情報 (アルファ チャネル) がある場合、この変換によって失われます。
この問題に関して、Stack Overflow でいくつか質問があります。この質問の最初の回答 ( GDI+ を使用して ARGB ビットマップを描画する方法は? ) の情報を使用して、試したコードを書きましたが、動作します。
これは基本的に、 GetObjectとBITMAP構造体を使用して、ネイティブの HBitmap の幅、高さ、およびピクセル データの場所へのポインターを取得し、マネージド Bitmap コンストラクターを呼び出します。
私が理解しているように (間違っている場合は修正してください)、これは実際のピクセル データをネイティブ HBitmap からマネージド ビットマップにコピーするのではなく、マネージド ビットマップをネイティブ HBitmap のピクセル データにポイントするだけです。
ここでは、別のグラフィックス (DC) または別のビットマップにビットマップを描画しません。これは、特に大きなビットマップの場合に不要なメモリ コピーを避けるためです。
このビットマップを PictureBox コントロールまたは Form BackgroundImage プロパティに割り当てるだけです。そしてそれは機能し、透明度を使用してビットマップが正しく表示されます。
ビットマップを使用しなくなったら、BackgroundImage プロパティがビットマップを指していないことを確認し、マネージ ビットマップとネイティブ HBitmap の両方を破棄します。
質問:この推論とコードが正しいかどうか教えてください。予期しない動作やエラーが発生しないことを願っています。そして、すべてのメモリとオブジェクトを正しく解放していることを願っています。