C#で描いた画像をファイルに保存してみた

WPFのC#で描いたラスタ画像をファイルに保存してみました。 試した環境は下記です。

  • Visual Studio 2015 Express for Windows Desktop

目次

  1. 処理の流れ
  2. 試してみた
    1. 何を作る?
    2. コード
    3. 実行結果

処理の流れ

BitmapEncoderクラスを使ってストリームに書き出します。

  1. BitmapSourceを作る。

  2. ファイルストリームを開く。

  3. BitmapEncoderのインスタンスを作る。

  4. BitmapSourceからBitmapFrameを作って、BitmapEncoderのFramesプロパティに渡す。

  5. BitmapEncoderインスタンスでファイルストリームに書き込む。

  6. ファイルストリームを閉じる。

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を作れないもんですかね。

実行結果

下記のPNGファイルが出来上がりました。 160220-1-01

公開日

広告