2010-12-31 14 views
3

(これはHow would I load a PNG image using Win32/GDI (no GDI+ if possible)?上の問題に関連している。)LoadImageとStretchDIBitsを使用してPNGイメージを描画するにはどうすればよいですか?

こんにちはすべて、

私はあなたがID IDB_PNG1とバイナリファイルに埋め込まれたPNGリソースを持っていることを考えると、不思議と、描画するLPDRAWITEMSTRUCTましたあなたのターゲットにはHDCと長方形があることを意味しています)、StretchDIBitsを使って、その画像をどのように画面に描画しますか?以前はBitBltTransparentBltで作業しましたが、StretchDIBitsは動作が異なるようですが、​​はPNGで動作しないようです。

ありがとうございました!

(注:言語はC++ですが、それほど重要ではありません... C、C#、Visual Basicなどは問題ありません;

+0

リソースをPNG形式のアイコンとして保存できる場合は、そのようにロードできますか? – Gabe

答えて

1

ビットマップ内のPNGサポートは、実際にはプリンタドライバでのみ使用されると思います。画面を表示するには、libpngなどのコードを使用して、PNGデータを自分で解凍する必要があります。

+0

ああ...私は確かにそれが来るのを見なかった。これを引き起こすディスプレイとプリンタの違いは何ですか? – Mehrdad

+1

プリンタは、一般的に(少なくとも履歴的には)、ディスプレイアダプタよりも実質的に機能が優れています。プリンタは帯域幅の狭い接続でも使用されるため、プリンタへのデータ送信にはビットの節約が重要です(すべての生のビットを送信するよりも、圧縮されたPNGをデコードできるプリンタに送る方がよい)。これにより、プリンタは、圧縮解除自体を行うときに最も適切な忠実度オプションを選択することもできます。しかし、ディスプレイハードウェアとドライバは、通常、より決定論的で、圧縮解除自体を避けたいと考えています。 –

+2

ファンクションは、ディスプレイではなくプリンタに使用されているかどうかをどのように認識しますか? – Gabe

9

リソースからPNGをロードし、それをHBITMAP(WICを使用)に変換する完全なコードサンプルを含むblog post(C++でのスプラッシュ画面の表示時)を書きました。 CreateCompatibleDC、SelectObject、およびBitBltを使用してターゲットHDCに表示することができます。

リソースから生のバイトをメモリにロードし、幅、高さなどでBITMAPINFOHEADER構造体を設定すると、StretchDIBitsを使用してPNGを直接表示できます。このMSDN sampleに示されているように。

System.Drawing(GDI +のラッパー)またはSystem.Windows.Media.Imaging(WPFアプリケーション)を使用してイメージの読み込みと描画を行うことができるため、C#とVB.NETソリューションはかなり異なるでしょう。

+1

これは非常に面白いです、それは私が探しているものであるようです。 'BITMAPINFOHEADER'を設定しようとすることに関する質問:画像の大きさを知るには?それでも私はWICを使わなければならないでしょうか? (編集:これはうまくいかないようです;グレッグの投稿に対する私のコメントを参照してください。しかし、ブログ記事へのリンクをありがとう、本当に役立つだろう...私は答えとして2つの投稿をマークすることができたらいいと思う。 :)) – Mehrdad

+1

画像の大きさを知るには、PNGファイルから画像を読み込むためにpngデコーダを書き込むか(またはlibpngまたはWICを使用する)、画像と同期した別のリソースとして保存する必要がありますPNGリソース。 (これは私がStretchDIBitsのアプローチを試みたことのない理由の一部ですが、私はいつもlibpngやWICを使ってPNGの読みを処理していました。) –

関連する問題