Symfoware

Symfowareについての考察blog

C# byte配列をグレースケール画像で保存する

C#で画像の操作を行う時、R,G,B,Aの4つの値を指定するかと思います。
色調0〜255の範囲のグレースケールを作成したいときには若干面倒。

1バイト1ピクセルの画像データとして扱えないか調べてみました。

Format8bppIndexed



こちらが参考になりました。
C#でのビットマップ操作(8bitグレイスケール) 記事をクリップする

Bitmapの形式に「Format8bppIndexed」を指定。
カラーパレットを作成してやれば良いようです。

サンプルはこんな感じになりました。


  1. using System;
  2. using System.Drawing;
  3. using System.Drawing.Imaging;
  4. using System.Runtime.InteropServices;
  5. namespace sample
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             int width = 256;
  12.             int height = 256;
  13.             // 0〜255のグレースケール画像
  14.             byte[] data = new byte[width * height];
  15.             // 画像の上から順に0から255へグラデーション
  16.             for(int h = 0; h < height; h++) {
  17.                 for (int w = 0; w < width; w++) {
  18.                     data[h * width + w] = (byte)h;
  19.                 }
  20.             }
  21.             // Format8bppIndexedを指定してBitmapオブジェクトを作成
  22.             Bitmap img = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
  23.             // カラーパレットを設定
  24.             ColorPalette pal = img.Palette;
  25.             for (int i = 0; i < 256; ++i) {
  26.                 pal.Entries[i] = Color.FromArgb(i, i, i);
  27.             }
  28.             img.Palette = pal;
  29.             // BitmapDataに用意したbyte配列を一気に書き込む
  30.             BitmapData bmpdata = img.LockBits(
  31.                 new Rectangle(0, 0, width, height),
  32.                 ImageLockMode.WriteOnly,
  33.                 PixelFormat.Format8bppIndexed
  34.             );
  35.             Marshal.Copy(data, 0, bmpdata.Scan0, data.Length);
  36.             img.UnlockBits(bmpdata);
  37.             // png形式で保存
  38.             img.Save("test.png", ImageFormat.Png);
  39.         }
  40.     }
  41. }



出力できた画像

893_01.png

狙い通りです。


【参考URL】
C#でのビットマップ操作(8bitグレイスケール) 記事をクリップする
[C#] ビットマップにピクセル単位で高速にアクセスするには (GetPixel/SetPixel vs BitmapData 速度比較)
画像フォーマットを指定して保存する
関連記事

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

  1. 2018/06/17(日) 14:24:21|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<C# Bitmap Format1bppIndexedで2色のみの画像を作成する | ホーム | .NET Core 2でBitmapオブジェクトを使用する>>

コメント

コメントの投稿


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

トラックバック

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