Symfoware

Symfowareについての考察blog

C# 8ビット グレースケール画像をpng, jpeg, tiffで保存する

byte配列をグレースケール画像として保存してみました。
C# byte配列をグレースケール画像で保存する

今回はBitmapEncoderを使用して画像の保存を試してみます。


カラーパレット



カラーパレットを自力で作成していましたが、グレースケール用のパレットは定義済でした。
BitmapPalettes.Gray256 プロパティ

カラーパレットはこれを利用しようと思います。
利用するには、PresentationCoreの参照設定を追加する必要がありました。

895_01.png

また、BitmapFrame.Createを実行するには、WindowsBaseの参照設定を追加する必要がありました。

895_02.png



BitmapSource.Create



こちらのサンプルが参考になります。
方法: PNG イメージをエンコードおよびデコードする

BitmapSource.CreateでBitmapSourceを生成し、保存すれば良いようです。
BitmapSource.Create メソッド


  1. public static BitmapSource Create(
  2.     int pixelWidth,
  3.     int pixelHeight,
  4.     double dpiX,
  5.     double dpiY,
  6.     PixelFormat pixelFormat,
  7.     BitmapPalette palette,
  8.     Array pixels,
  9.     int stride
  10. )




png画像の保存



早速、前回のソースを加工してpng画像のグレースケール保存を試してみます。


  1. using System.IO;
  2. using System.Windows.Forms;
  3. using System.Windows.Media;
  4. using System.Windows.Media.Imaging;
  5. namespace WindowsFormsApp1
  6. {
  7.     public partial class Form1 : Form
  8.     {
  9.         public Form1()
  10.         {
  11.             InitializeComponent();
  12.             
  13.         }
  14.         private void button1_Click(object sender, System.EventArgs e)
  15.         {
  16.             int width = 256;
  17.             int height = 256;
  18.             // 0〜255のグレースケール画像
  19.             byte[] data = new byte[width * height];
  20.             // 画像の上から順に0から255へグラデーション
  21.             for (int h = 0; h < height; h++)
  22.             {
  23.                 for (int w = 0; w < width; w++)
  24.                 {
  25.                     data[h * width + w] = (byte)h;
  26.                 }
  27.             }
  28.             BitmapSource image = BitmapSource.Create(
  29.                 width,
  30.                 height,
  31.                 96, // DPI x
  32.                 96, // DPI y
  33.                 PixelFormats.Indexed8,
  34.                 BitmapPalettes.Gray256,
  35.                 data,
  36.                 width);
  37.             FileStream stream = new FileStream(@"c:\dev\new.png", FileMode.Create);
  38.             PngBitmapEncoder encoder = new PngBitmapEncoder();
  39.             encoder.Interlace = PngInterlaceOption.On;
  40.             encoder.Frames.Add(BitmapFrame.Create(image));
  41.             encoder.Save(stream);
  42.         }
  43.     }
  44. }





jpeg画像の保存



同様に、jpeg画像の保存を試してみます。


  1. using System.IO;
  2. using System.Windows.Forms;
  3. using System.Windows.Media;
  4. using System.Windows.Media.Imaging;
  5. namespace WindowsFormsApp1
  6. {
  7.     public partial class Form1 : Form
  8.     {
  9.         public Form1()
  10.         {
  11.             InitializeComponent();
  12.             
  13.         }
  14.         private void button1_Click(object sender, System.EventArgs e)
  15.         {
  16.             int width = 256;
  17.             int height = 256;
  18.             // 0〜255のグレースケール画像
  19.             byte[] data = new byte[width * height];
  20.             // 画像の上から順に0から255へグラデーション
  21.             for (int h = 0; h < height; h++)
  22.             {
  23.                 for (int w = 0; w < width; w++)
  24.                 {
  25.                     data[h * width + w] = (byte)h;
  26.                 }
  27.             }
  28.             BitmapSource image = BitmapSource.Create(
  29.                 width,
  30.                 height,
  31.                 96, // DPI x
  32.                 96, // DPI y
  33.                 PixelFormats.Indexed8,
  34.                 BitmapPalettes.Gray256,
  35.                 data,
  36.                 width);
  37.             /* png
  38.              * FileStream stream = new FileStream(@"c:\dev\new.png", FileMode.Create);
  39.             PngBitmapEncoder encoder = new PngBitmapEncoder();
  40.             encoder.Interlace = PngInterlaceOption.On;
  41.             */
  42.             FileStream stream = new FileStream(@"c:\dev\new.jpg", FileMode.Create);
  43.             JpegBitmapEncoder encoder = new JpegBitmapEncoder();
  44.             encoder.QualityLevel = 100;
  45.             
  46.             encoder.Frames.Add(BitmapFrame.Create(image));
  47.             encoder.Save(stream);
  48.         }
  49.     }
  50. }





tiff画像の保存



最後にtiff画像を保存してみます。


  1. using System.IO;
  2. using System.Windows.Forms;
  3. using System.Windows.Media;
  4. using System.Windows.Media.Imaging;
  5. namespace WindowsFormsApp1
  6. {
  7.     public partial class Form1 : Form
  8.     {
  9.         public Form1()
  10.         {
  11.             InitializeComponent();
  12.             
  13.         }
  14.         private void button1_Click(object sender, System.EventArgs e)
  15.         {
  16.             int width = 256;
  17.             int height = 256;
  18.             // 0〜255のグレースケール画像
  19.             byte[] data = new byte[width * height];
  20.             // 画像の上から順に0から255へグラデーション
  21.             for (int h = 0; h < height; h++)
  22.             {
  23.                 for (int w = 0; w < width; w++)
  24.                 {
  25.                     data[h * width + w] = (byte)h;
  26.                 }
  27.             }
  28.             BitmapSource image = BitmapSource.Create(
  29.                 width,
  30.                 height,
  31.                 96, // DPI x
  32.                 96, // DPI y
  33.                 PixelFormats.Indexed8,
  34.                 BitmapPalettes.Gray256,
  35.                 data,
  36.                 width);
  37.             /* png
  38.              * FileStream stream = new FileStream(@"c:\dev\new.png", FileMode.Create);
  39.             PngBitmapEncoder encoder = new PngBitmapEncoder();
  40.             encoder.Interlace = PngInterlaceOption.On;
  41.             */
  42.             /*
  43.             FileStream stream = new FileStream(@"c:\dev\new.jpg", FileMode.Create);
  44.             JpegBitmapEncoder encoder = new JpegBitmapEncoder();
  45.             encoder.QualityLevel = 100;
  46.             */
  47.             FileStream stream = new FileStream(@"c:\dev\new.tif", FileMode.Create);
  48.             TiffBitmapEncoder encoder = new TiffBitmapEncoder();
  49.             encoder.Compression = TiffCompressOption.Zip;
  50.             encoder.Frames.Add(BitmapFrame.Create(image));
  51.             encoder.Save(stream);
  52.         }
  53.     }
  54. }






容量の比較



簡単な画像なので、容量比較するのも微妙ですが、tiff形式が最も圧縮されました。

・png
1,747 バイト

・jpg
6,516 バイト

・tif
860 バイト


【参考URL】

方法: PNG イメージをエンコードおよびデコードする
BitmapPalette クラス
BitmapPalettes.Gray256 プロパティ
BitmapSource.Create メソッド
BitmapEncoder クラス
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2018/06/18(月) 23:05:11|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<C# グレースケール画像操作の高速化(Parallel.For) | ホーム | C# Bitmap Format1bppIndexedで2色のみの画像を作成する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
https://symfoware.blog.fc2.com/tb.php/2197-c904a29f
この記事にトラックバックする(FC2ブログユーザー)