C#のWPFアプリでPNG形式の画像ファイルの読み込みと書き出しをする

C#のWPFアプリで、PNG形式の画像ファイルを読み込んでBitmapSourceへ変換し、さらにBitmapSourceからPNGファイルへの出力をします。

MSDNのHowTo をもう少し詳しく解説します。

目次

  1. PNGファイル読み込みの手順
    1. PngBitmapDecoderコンストラクター
    2. BitmapCreateOptions列挙体
    3. BitmapCacheOption列挙体
    4. BitmapDecoder.Framesプロパティ
  2. PNGファイルへの書き出しの手順
    1. PngBitmapEncoderコンストラクター
    2. BitmapEncoder.Framesプロパティ
    3. BitmapEncoder.Saveメソッド
  3. 実施例
    1. ウィンドウレイアウト
    2. コード

PNGファイル読み込みの手順

  1. PNGファイルをファイルストリームで開く

  2. PngBitmapDecoderクラスのデコーダー用インスタンスを作る

  3. ファイルストリームをデコーダーインスタンスを使ってBitmapSourceに変換する

PngBitmapDecoderコンストラクター

using System.Windows.Media.Imaging;

PngBitmapDecoder obj = new PngBitmapDecoder(Stream, BitmapCreateOptions, BitmapCacheOption);

変数

内容

Stream

Stream

読み込み用のファイルストリーム

BitmapCreateOptions

BitmapCreateOptions

ビットマップの初期化オプション

BitmapCacheOption

BitmapCacheOption

ビットマップのキャッシュオプション

obj

PngBitmapDecoder

デコーダーインスタンス

デコード用のインスタンスを作成します。Stream以外の引数は下記のようになります。

BitmapCreateOptions列挙体

読み込む際の設定を指定します。

None

0

既定値。何も指定しない。

PreservePixelFormat

1

ファイルと読み込み先のPixelFormatが同じかどうか確認をする。

DelayCreation

2

必要になるまで、BitmapSourceオブジェクトの初期化を遅延させる。

IgnoreColorProfile

4

カラープロファイルを無視する。

IgnoreImageCache

8

既存のキャッシュを利用せずに読み込む。

BitmapCacheOption列挙体

ファイルを読み込む際のキャッシュの方法を指定します。

Default

0

既定値。イメージ全体をメモリにキャッシュする。

OnDemand

0

最初だけメモリに読み込み、以降はキャッシュを利用する。

OnLoad

1

イメージ全体をキャッシュし、キャッシュのデータを利用する。

None

2

イメージデータをファイルから直接入力する。

BitmapDecoder.Framesプロパティ

デコーダーインスタンスのFramesプロパティの最初のインデックスのフレームを参照すると、デコードした画像データを取得できます。

BitmapFrame dst = PngBitmapDecoder.Frames[0]

変数

内容

dst

BitmapFrame

デコードされた画像データ

Framesプロパティ自体はコレクションなので、0番のインデックスのフレームを画像データとして取得します。

BitmapFrameはBitmapSourceへキャストできます。

以上のようにして、PNGデータをBitmapSourceへ変換できます。

PNGファイルへの書き出しの手順

  1. 書き出し用のファイルをファイルストリームで開く

  2. PngBitmapEncoderクラスのエンコーダー用インスタンスを作る

  3. BitmapSourceをBitmapFrameに変換する

  4. BitmapFrameをエンコーダーにセットする

  5. エンコーダーでファイルストリームに書き出す

PngBitmapEncoderコンストラクター

using System.Windows.Media.Imaging;

PngBitmapEncoder obj = new PngBitmapEncoder();

変数

内容

obj

PngBitmapEncoder

エンコーダーインスタンス

エンコーダーインスタンスを作成します。

引数はありません。

BitmapEncoder.Framesプロパティ

PngBitmapEncoder.Frames.Add(frame);

変数

内容

frame

BitmapFrame

保存する画像のデータ

エンコーダーにフレームを設定するプロパティです。BitmapFrameのコレクションですので、addでデータを追加します。

BitmapEncoder.Saveメソッド

PngBitmapEncoder.Save(stream);

変数

内容

stream

Stream

エンコードしたデータを保存するファイルストリーム

エンコードした画像データをファイルストリームに保存します。

実施例

PNGファイルを読み込んでImageコントロールに表示し、表示したデータを別のPNGファイルに書き出します。

サンプルの画像は プロ生ちゃん です。

サンプル画像

ウィンドウレイアウト

XAMLはこのようにしました。

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="300">
    <Grid>
        <Image Name="imgSrc" Stretch="None" />
    </Grid>
</Window>

ウィンドウの中にImageコントロールがあるだけです。

コード

MainWindow.xaml.csに、下記のように記述します。

using System.IO;
using System.Windows;
using System.Windows.Media.Imaging;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // PNGファイルから読み込んでBitmapSourceに変換
            Stream fs_read = new FileStream("test.png", FileMode.Open, FileAccess.Read, FileShare.Read);
            PngBitmapDecoder decoder = new PngBitmapDecoder(fs_read, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
            BitmapSource bmpsrc = decoder.Frames[0];

            // Imageコントロールに表示
            imgSrc.Source = bmpsrc;

            // BitmapSourceをPNG形式で書き出し
            FileStream fs_write = new FileStream("out.png", FileMode.Create);
            PngBitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bmpsrc));
            encoder.Save(fs_write);

        }
    }
}

これを実行するとこのようなウィンドウが表示されます。

実行ウィンドウ

ファイルが読み込まれてImageコントロールに表示されました。

そして、サンプル画像ファイルと同じフォルダにout.pngというファイルが作られます。

ファイル出力結果

無事にPNGファイルに出力されました。

公開日

広告