none
WPFで画像を縮小して保存する方法 RRS feed

  • 質問

  • いつもお世話になります。
    VisualC#2010、WindowsXPでの動作について質問があります。
    WPFで画像を縮小して保存する方法で困っています。
    BitmapImage theImage;
    theImage.UriSource = new Uri(fileName);
    Image afterImage = new Image();
    afterImage.Source = theImage;
    afterImage.Width = theImage.Width/2;
    afterImage.Hight = theImage.Height/2;
    これで、afterImageに1/2縮小の画像は入ると思うのですが、
    これをbmpやjpgとして保存するには、このあとどのように処理したらよいでしょうか?
    2010年9月7日 13:48

回答

すべての返信

  • 単純に縮小すると、ギザギザが出て使い物にならなくなるので、補間が必
    要になると思います。

    以下のページが参考になりませんか?

    画像を高品質に拡大/縮小するには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/023resize/resize.html

    • 回答の候補に設定 山本春海 2010年10月1日 4:38
    • 回答としてマーク 山本春海 2010年10月8日 2:49
    2010年9月7日 14:06
  • 以下のスレッドに似たような話題がありますね。

    WPF での画像の拡大
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=51404&KLOG=86

    Resizing images in WPF
    http://social.msdn.microsoft.com/forums/en-US/wpf/thread/45d9de29-d8fb-4a82-bd3e-14f1109e1f00

    Image クラスからの保存はできないかもしれません。
    System.Windows.Media.Imaging 名前空間のクラスを使っていくことになるかと思われます。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2010年10月1日 4:38
    • 回答としてマーク 山本春海 2010年10月8日 2:49
    2010年9月7日 14:29
    モデレータ
  • Bitmapは、Formsなので、使えないと思います。
    というか、Formアプリケーションでの方法ではなく、WPFの方法をお願いします。
    • 回答の候補に設定 NicoFost 2011年1月19日 10:20
    2010年9月7日 14:31
  • System.Drawing にせよ System.Windows.Media.Imaging にせよ、べつに「**でなきゃ使えない」って事はありません。所詮 GDI+ や WIC のラッパライブラリにすぎないのですから、WinForm で System.Windows.Media.Imaging を使ったり WPF で System.Drawing を使っても何の問題もありません。単にそのウィンドウシステムがネイティブで使用している画像ライブラリが System.Drawing だったり System.Windows.Media.Imaging だったりするだけです。

    画像処理ライブラリとしては、WIC には扱いづらい面があります。System.Drawing / GDI+ を考えた方が楽な場合もあるでしょう。特に System.Drawing は DLL も WinForm からは独立してるので、そう否定的に捕らえることもないと思います。

    さて、System.Windows.Media.Imaging では基本的に BitmapSource のチェーンで変換を適用していくことになります。スケーリング(および回転)は TransformedBitmap を使います。難点は補間方法を選択できなかったはずってところぐらいですかね。

    1. BitmapImage とか BitmapDecoder とかで元画像をロード
    2. それを元に TransformedBitmap を作成(ScaleTransform を使ってスケーリング)
    3. それを元に BitmapFrame.Create で BitmapFrame を作成
    4. ***BitmapEncoder を作って、Frames に BitmapFrame を追加して Save

    という流れになるかと思います。

    • 編集済み Hongliang 2010年9月7日 14:59 TransletedBitmap -> TransformedBitmap に修正
    • 回答の候補に設定 山本春海 2010年10月1日 4:38
    2010年9月7日 14:56
  • こんにちは、HANA01 さん。

    MSDN フォーラムのご利用ありがとうございます。フォーラム オペレーターの山本です。

    その後いかがでしょうか。
    みなさんからの情報はご確認いただけましたか?
    有効な情報と思われるものに、勝手ながらわたしのほうで回答としてマークさせていただきました。
    投稿いただいたみなさん、情報ありがとうございました。

    いただいた返信の中で、解決に役立った情報や、参考になった情報には、回答としてマークすることをお願いしています。
    今後、同じ問題でこのスレッドを参照される方にも、有効な情報がわかりやすくなるかと思いますので、ご協力よろしくお願いいたします。

    リサイズさせる方法について、検索してみたところ、米国本社のサイトにそれらしきタイトルのものがありましたので、もしかしたら参考になるかもしれません。(試していないので、間違っていたらごめんなさい。)

     Resizing Image
     http://social.msdn.microsoft.com/forums/en-US/wpf/thread/580fca03-d15b-48b2-9fb3-2e6fec8a2c68

    もしよろしければ、お時間のある時にでも状況をお知らせくださいね。
    一旦回答としてマークをつけさせていただきましたが、ご不明点などありましたら、具体的な不明点などを記載いただいて、ご質問を続けてくださいね。
    今後とも、MSDN フォーラムをご利用よろしくお願いいたします。それでは。
                                                                                                                                
    マイクロソフト株式会社 MSDN フォーラム オペレーター 山本 春海

    2010年10月8日 2:49