スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WPF のサンプルコード 画像ファイルの読込と保存

C#+WPF (Windows Presentation Foundation) のサンプルコード。画像ファイルの読込と保存を行うアプリケーションを作成。

Windows 7+Visual Studio 2013 Express Edition のパソコン環境において動作確認。

新しいプロジェクトの作成

  • テンプレート: Visual C# - Windows - WPF アプリケーション
  • 名前: WpfAppSample
  • ソリューション名: WpfAppSample

MainWindow.xaml

<Window x:Name="mainWindow" x:Class="WpfAppSample.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WpfAppSample" Background="Black">
    <Window.CommandBindings>
        <CommandBinding 
            Command="ApplicationCommands.Open" 
            Executed="OpenCommand_Executed" />
        <CommandBinding 
            Command="ApplicationCommands.SaveAs" 
            Executed="SaveAsCommand_Executed" />
        <CommandBinding 
            Command="ApplicationCommands.Close" 
            Executed="CloseCommand_Executed" />
    </Window.CommandBindings>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>

        <Menu x:Name="mainMenu" Grid.Column="0" Grid.Row="0">
            <MenuItem x:Name="fileMenuItem" Header="ファイル(_F)">
                <MenuItem x:Name="openMenuItem" Header="開く(_O)" 
                    Command="ApplicationCommands.Open" />
                <MenuItem x:Name="saveAsMenuItem" Header="名前を付けて保存(_A)" 
                    Command="ApplicationCommands.SaveAs" />
                <Separator />
                <MenuItem x:Name="exitMenuItem" Header="終了(_X)" 
                    Command="ApplicationCommands.Close"
                    InputGestureText="Alt+F4" />
            </MenuItem>
        </Menu>
        <ScrollViewer x:Name="scrollViewer" Grid.Column="0" Grid.Row="1"
            VerticalScrollBarVisibility="Disabled">
            <Image x:Name="image" Stretch="Uniform"
                RenderOptions.BitmapScalingMode="HighQuality" />
        </ScrollViewer>
    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using Microsoft.Win32;  // OpenFileDialog, SaveFileDialog
using System.IO;        // FileStream

namespace WpfAppSample
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        // メニュー - 終了
        private void CloseCommand_Executed(
            object sender, ExecutedRoutedEventArgs e)
        {
            this.Close();
        }

        // メニュー - 開く
        private void OpenCommand_Executed(
            object sender, ExecutedRoutedEventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter =
                "画像ファイル|*.bmp;*.gif;*.jpg;*.jpeg;*.png;*.tif;*.tiff"
                    + "|BMPファイル(*.bmp)|*.bmp"
                    + "|GIFファイル(*.gif)|*.gif"
                    + "|JPEGファイル(*.jpg;*.jpeg)|*.jpg;*.jpeg"
                    + "|PNGファイル(*.png)|*.png"
                    + "|TIFFファイル(*.tif;*.tiff)|*.tif;*.tiff";
            Nullable<bool> result = dialog.ShowDialog();
            if (result == true)
            {
                image.Source = 
                    CommonUtils.FileToBitmapImage(dialog.FileName);
            }
        }

        // メニュー - 保存
        private void SaveAsCommand_Executed(
            object sender, ExecutedRoutedEventArgs e)
        {
            SaveFileDialog dialog = new SaveFileDialog();
            dialog.Filter = "BMPファイル(*.bmp)|*.bmp"
                + "|GIFファイル(*.gif)|*.gif"
                + "|JPEGファイル(*.jpg)|*.jpg"
                + "|PNGファイル(*.png)|*.png"
                + "|TIFFファイル(*.tif)|*.tif";
            Nullable<bool> result = dialog.ShowDialog();
            if (result == true)
            {
                CommonUtils.BitmapSourceToFile(
                    dialog.FileName, image.Source as BitmapSource);
            }
        }
    }

    /// <summary>
    /// 汎用のメソッド
    /// </summary>
    public static class CommonUtils
    {
        // 画像ファイル → BitmapImage
        public static BitmapImage FileToBitmapImage(string filePath)
        {
            BitmapImage bi = null;

            try
            {
                using (FileStream fs = File.OpenRead(filePath))
                {
                    bi = new BitmapImage();
                    bi.BeginInit();
                    bi.StreamSource = fs;
                    bi.CacheOption = BitmapCacheOption.OnLoad;
                    bi.EndInit();
                }
            }
            catch
            {
                bi = null;
            }

            return bi;
        }

        // BitmapSource → 画像ファイル
        public static void BitmapSourceToFile(
            string filePath, BitmapSource bmpSrc)
        {
            if (bmpSrc == null)
            {
                return;
            }

            string ext = System.IO.Path.GetExtension(filePath).ToLower();
            BitmapEncoder encoder = null;
            switch (ext)
            {
                case ".bmp":
                    encoder = new BmpBitmapEncoder();
                    break;                
                case ".gif":
                    encoder = new GifBitmapEncoder();
                    break;
                case ".jpg":
                    encoder = new JpegBitmapEncoder();
                    break;
                case ".png":
                    encoder = new PngBitmapEncoder();
                    break;
                case ".tif":
                    encoder = new TiffBitmapEncoder();
                    break;
            }

            if (encoder != null)
            {
                encoder.Frames.Add(BitmapFrame.Create(bmpSrc));
                using(FileStream fs = 
                    new FileStream(filePath, System.IO.FileMode.Create))
                {
                    encoder.Save(fs);
                }
            }
        }    
    }
}

【theme : プログラミング
【genre : コンピュータ

プロフィール

よしいず

Author:よしいず
MATHEMATICS.PDFというウェブサイトを運営しています。

管理の都合上、トラックバックとコメントはオフにしてあります。ブログ経験者なら分かっていただけると思いますが、スパム(アダルトやその他の宣伝)ばかりなのが現実です。

リンクは自由です。当サイトの記事に対する間違いの指摘・意見・感想などを述べた記事からのリンクは歓迎です。ただし、ブログ記事アップ直後はミスが多く、頻繁に修正します。場合によっては削除する可能性もあります。その際、何も断りもなく修正・削除しますがご了承ください。内容を参考にする場合には投稿後一週間ほど様子を見てからにしてください(笑)。

記事の間違いを指摘するときは、その具体的箇所、理由(仕様に反するなど)・根拠(参考にした文献など)、代替案(同じ結果を得るための正しいやり方)も教えてください。そうしないと、(指摘される側および第三者はその時点では無知の状態なので、)どこが間違いなのか分かりませんし、本当に間違っているのかどうかが判断・検証できません。実際、間違いだと指摘されたことが結局は正しかったというケースもありますので。

このブログのタイトル一覧

リンク
月別アーカイブ
カテゴリ
最新記事
検索フォーム
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。