C#のWPFアプリでPNG形式の画像ファイルの読み込みと書き出しをする
C#のWPFアプリで、PNG形式の画像ファイルを読み込んでBitmapSourceへ変換し、さらにBitmapSourceからPNGファイルへの出力をします。
MSDNのHowTo をもう少し詳しく解説します。
目次
PNGファイル読み込みの手順
PNGファイルをファイルストリームで開く
PngBitmapDecoderクラスのデコーダー用インスタンスを作る
ファイルストリームをデコーダーインスタンスを使って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ファイルへの書き出しの手順
書き出し用のファイルをファイルストリームで開く
PngBitmapEncoderクラスのエンコーダー用インスタンスを作る
BitmapSourceをBitmapFrameに変換する
BitmapFrameをエンコーダーにセットする
エンコーダーでファイルストリームに書き出す
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ファイルに出力されました。
公開日
広告
C#で画像処理カテゴリの投稿
- C#でBitmapImageをByte配列に変換してみた
- C#でBitmapで描いた画像をImageコントロールに表示してみた
- C#でHSBで色指定してラスタ画像を描いてみた
- C#でOpenCVを使う
- C#でラスタ画像を描いてみた
- C#で写真の中の線を抽出してみた
- C#で描いた画像をファイルに保存してみた
- C#で画像の色を反転してみた
- C#で画像を描いてみた(WPFでBitmapSource.Create編)
- C#で画像を描いてみた(WPFでWritableBitmap編)
- C#で画像ファイルを表示してみた
- C#のOpenCvSharpでMatとBitmapSourceを変換する
- C#のWPFアプリでPNG形式の画像ファイルの読み込みと書き出しをする