C#で描いた画像をファイルに保存してみた
WPFのC#で描いたラスタ画像をファイルに保存してみました。 試した環境は下記です。
Visual Studio 2015 Express for Windows Desktop
目次
処理の流れ
BitmapEncoderクラスを使ってストリームに書き出します。
BitmapSourceを作る。
ファイルストリームを開く。
BitmapEncoderのインスタンスを作る。
BitmapSourceからBitmapFrameを作って、BitmapEncoderのFramesプロパティに渡す。
BitmapEncoderインスタンスでファイルストリームに書き込む。
ファイルストリームを閉じる。
BitmapEncoderにはファイルフォーマット毎に派生クラスがあります。今回はPNGにしてみました。
試してみた
何を作る?
256x100で左から右に黒から白へのグラデーションをする画像データを作って、PNG形式で保存し、ついでにウィンドウに表示するアプリです。
コード
XAMLの方は、Imageコントロールを配置しただけです。
<Window x:Class="image_trial3.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:image_trial3"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="300" Background="LightGray">
<Grid>
<Image Name="image" Stretch="None" />
</Grid>
</Window>
プログラムは下記です。
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.IO;
namespace image_trial3
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
int width = 256;
int height = 100;
int dpi = 96;
int pixelsSize = (int)(width * height * 4);
byte[] pixels = new byte[pixelsSize];
// バイト列に色情報を入れる
byte value = 0;
for (int x = 0; x < width * height * 4; x = x + 4)
{
byte blue = value;
byte green = value;
byte red = value;
byte alpha = 255;
pixels[x] = blue;
pixels[x + 1] = green;
pixels[x + 2] = red;
pixels[x + 3] = alpha;
if (value < 255)
{
value++;
}
else
{
value = 0;
}
}
// BitmapSourceを作る
int stride = (width * PixelFormats.Pbgra32.BitsPerPixel + 7) / 8;
BitmapSource bitmap = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Pbgra32, null, pixels, stride);
// BitmapSourceを保存する
using (Stream stream = new FileStream("test.png", FileMode.Create))
{
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
encoder.Save(stream);
}
// ウィンドウに表示
image.Source = bitmap;
}
}
}
バイト配列から直接BitmapFrameを作れないもんですかね。
公開日
広告
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形式の画像ファイルの読み込みと書き出しをする