Symfoware

Symfowareについての考察blog

C# Bitmap Format1bppIndexedで2色のみの画像を作成する

Format8bppIndexedを指定して、グレースケール画像を作成してみました。
C# byte配列をグレースケール画像で保存する

もう一歩進めて、「Format1bppIndexed」を指定し、2色のカラーパレットを持つ画像を作成してみます。


ビットシフト



Format8bppIndexedの場合は、1ピクセル1バイトで表現していましたが、
Format1bppIndexedの場合は、8ピクセルを1バイトで表現します。

うまくビットシフトしながら、画像データを作成していきます。


  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.             int length = width * height / 8;
  14.             if ((width * height % 8) != 0) {
  15.                 length++;
  16.             }
  17.             // 赤、
  18.             byte[] data = new byte[length];
  19.             // 画像の上から半分以降はビットを立てる
  20.             int scan = 0;
  21.             for(int h = 127; h < height; h++) {
  22.                 for (int w = 0; w < width; w++) {
  23.                     int shift = scan % 8;
  24.                     if (shift == 0) {
  25.                         data[scan / 8] |= 1;
  26.                     } else {
  27.                         data[scan / 8] |= (byte)(1 << (8 - shift));
  28.                     }
  29.                     scan++;
  30.                 }
  31.             }
  32.             // Format1bppIndexedを指定してBitmapオブジェクトを作成
  33.             Bitmap img = new Bitmap(width, height, PixelFormat.Format1bppIndexed);
  34.             // カラーパレットを設定
  35.             ColorPalette pal = img.Palette;
  36.             pal.Entries[0] = Color.Red; // bit:1
  37.             pal.Entries[1] = Color.Blue; // bit:0
  38.             img.Palette = pal;
  39.             // BitmapDataに用意したbyte配列を一気に書き込む
  40.             BitmapData bmpdata = img.LockBits(
  41.                 new Rectangle(0, 0, width, height),
  42.                 ImageLockMode.WriteOnly,
  43.                 PixelFormat.Format1bppIndexed
  44.             );
  45.             Marshal.Copy(data, 0, bmpdata.Scan0, data.Length);
  46.             img.UnlockBits(bmpdata);
  47.             // png形式で保存
  48.             img.Save("test.png", ImageFormat.Png);
  49.         }
  50.     }
  51. }



実行結果

894_01.png

画像の容量は減りますが座標計算が厄介ですね。
関連記事

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

  1. 2018/06/17(日) 15:07:46|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<C# 8ビット グレースケール画像をpng, jpeg, tiffで保存する | ホーム | C# byte配列をグレースケール画像で保存する>>

コメント

コメントの投稿


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

トラックバック

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