none
32ビットフルカラーのビットマップを、4ビットグレースケールに変更 RRS feed

  • 質問

  • いつもお世話になります。
    Windows7, Visual Studio 2010での質問です。

    32ビットフルカラーのビットマップを、
    4ビットグレースケールに変更して保存したいと考えています。

    Bitmap gray = convert2Grayscale(bmp);
    gray.Save("gray.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
    bmp.Save("color.bmp" ,System.Drawing.Imaging.ImageFormat.Bmp);

    private Bitmap convert2Grayscale(Bitmap original) {
    Bitmap newBitmap = new Bitmap(original.Width, original.Height);
    for (int i = 0; i < original.Width; i++){
     for (int j = 0; j < original.Height; j++){
      Color originalColor = original.GetPixel(i, j);

      int grayScale = (int)((originalColor.R * .3) + (originalColor.G * .59) + (originalColor.B * .11));
      Color newColor =  Color.FromArgb(grayScale, grayScale, grayScale);
      newBitmap.SetPixel(i, j, newColor);
     }
    }
    return newBitmap;
    }
    でグレー化はできたのですが、できた画像も32ビットの深度をもっています。
    4ビットで保存するにはどのようにしたらよいでしょうか?

    2013年1月4日 12:10

回答

  • new Bitmapの引数で、その画像のピクセル形式PixelFormatを指定できます。

    ただし、インデックスカラーのBitmapの場合SetPixelは使用できないので、LockBitsメソッドからBitmapDataを使って、直接ピクセルデータにアクセスする必要があります。各ピクセルはパレットのインデックスを指し、パレット情報はPaletteプロパティを使って指定します。

    また4bitであるなら、使用できる色は16色だけです。お出しになったコードでは(0,0,0)から(255,255,255)までの256階調になっているので、適切に減色する必要があります。

    2013年1月4日 12:18

すべての返信

  • new Bitmapの引数で、その画像のピクセル形式PixelFormatを指定できます。

    ただし、インデックスカラーのBitmapの場合SetPixelは使用できないので、LockBitsメソッドからBitmapDataを使って、直接ピクセルデータにアクセスする必要があります。各ピクセルはパレットのインデックスを指し、パレット情報はPaletteプロパティを使って指定します。

    また4bitであるなら、使用できる色は16色だけです。お出しになったコードでは(0,0,0)から(255,255,255)までの256階調になっているので、適切に減色する必要があります。

    2013年1月4日 12:18
  • ありがとうございます。できました。
    2013年1月4日 13:37