VS2005, VC++, MFC, SDI アプリケーションです。
ダイアログ上に jpeg, gif 等の画像を(そのままおよび90度回転で)表示し、できれば印刷もしたいと思っています。
BMP画像については入門書に出ていますが、jpeg, gif 等については出ていないので調べました。
(A)
COMのIStreamとIPictureを使う方法が、ここに出ています。
http://www.athomejp.com/goldfish/mfc/cobject/jpegview.asp
表示する関数は Render で、これは回転は出来ないようです。
(B)
CImage による方法は、ここに出ています。
表示する関数は BitBlt / StrechBlt などが使えるようです。
(BMPを扱ったとき PlgBlt 関数で回転できたが、印刷が出来なかったと思います。)
両方でサンプルプログラムを作って試してみました。
デジカメ写真の数MByteのjpg画像を縮小表示しましたが、(A)はOKですが、(B)はかなり暗くなってしまいます。
【質問1】(A)と(B)にはそういう違いがあるのでしょうか?
【質問2】両方とも表示されるまで時間が掛かりすぎます。Windowsのエクスプローラの縮小表示のように瞬時に表示する方法はないでしょうか?
また、90度回転については、ここの掲示板の中にありました。
http://madia.world.coocan.jp/vc/vc_bbs/200603/200603_06030044.html
これは CImage による場合です。
【質問3】(A)の方法で90度回転するにはどうしたらいいでしょうか?
「Windowsが画像をどのように扱うのかといった知識無しにはプログラムは書けません」と叱られそうですが、初心者です。
どなたか教えてください。お願いいたします。
(B)に書いたはずのURLが消えています。こちらです。
http://suger-poem.blog.so-net.ne.jp/
>【質問1】(A)と(B)にはそういう違いがあるのでしょうか?
CImageのStrechBltはCDC::SetStretchBltModeで設定される伸縮モードに依存します。
>【質問2】両方とも表示されるまで時間が掛かりすぎます。Windowsのエクスプローラの縮小表示のように瞬時に表示する方法はないでしょうか?
画像をあらかじめ縮小しておいて描画すれば早くなりますが
毎回StrechBltでもそんなに時間かからないのでは?
まさか描画のたびに画像を読み込んでいるとか?
>【質問3】(A)の方法で90度回転するにはどうしたらいいでしょうか?
メモリDCに縮小した画像を作成しておきそこから
PlgBltで画面orプリンタのDCに転送してはどうでしょうか。
subaruさん、有り難うございます。
(A)と(B)の違いが一つ判りました。
透明GIFを表示したところ、(A)では透明になりましたが、(B)はなりませんでした。
(B)ではPlgBltを使ってマスクをすればいいらしいですが、よく理解できていません。
> まさか描画のたびに画像を読み込んでいるとか?
その通りです。起動時にも画像を読み込んでいます。読み込みに時間が掛かっています。
エクスプローラの縮小表示はあらかじめ読み込んでいるのでしょうか。
> メモリDCに縮小した画像を作成しておき
そのようですね。
http://homepage3.nifty.com/mitui707/VisualC/VCimageJPEG.html/
このお手本では一時フォルダにセーブしています。
まだ解決していませんが、「解決」で締めさせて戴き、別途具体的なコードを示してご教授をお願いするつもりです。
ありがとうございました。
ツイート | ![]() |