将位图图像保存为C#中的灰度图像

时间:2011-11-10 10:27:36

标签: c#

这是我的位图代码

Bitmap b = new Bitmap(columns, rows, PixelFormat.Format24bppRgb);
BitmapData bmd = b.LockBits(new Rectangle(0, 0, columns, rows), ImageLockMode.ReadWrite, b.PixelFormat); 

如何将其保存为灰度图像?

我非常感兴趣的是保存部分。如何将其保存为文件?

4 个答案:

答案 0 :(得分:1)

我之前使用了类似的方法

http://www.codeproject.com/KB/graphics/quickgrayscale.aspx

e.g:

            for (int Y = 0; Y < Size.Y; Y++)
            {
                PixelData_s* PPixel =
                    PixelAt(0, Y, ImageWidth, PBase);

                for (int X = 0; X < Size.X; X++)
                {
                    byte Value = (byte)((PPixel->Red + PPixel->Green + PPixel->Blue) / 3);
                    PPixel->Red = Value;
                    PPixel->Green = Value;
                    PPixel->Blue = Value;
                    PPixel++;
                } // End for
            } // End for

基本上将给定像素的RGB分量值相加并除以3.这需要使用指针的操作所需的unsafe关键字。您可以避免使用指针,只需执行以下操作:

        for (int X = 0; X < Size.X; X++)
        {
            for (int Y = 0; Y < Size.Y; Y++)
            {
                Color C = WinBitmap.GetPixel(X, Y);
                int Value = (C.R + C.G + C.B) / 3;
                WinBitmap.SetPixel(X, Y, Color.FromArgb(Value, Value, Value));
            } // End for
        } // End for

但这比较慢。

答案 1 :(得分:1)

我在这个地址找到了一个函数怎么做

How to convert a colour image to grayscale

public Bitmap ConvertToGrayscale(Bitmap source)
{
  Bitmap bm = new Bitmap(source.Width,source.Height);
  for(int y=0;y<bm.Height;y++)
  {
    for(int x=0;x<bm.Width;x++)
    {
      Color c=source.GetPixel(x,y);
      int luma = (int)(c.R*0.3 + c.G*0.59+ c.B*0.11);
      bm.SetPixel(x,y,Color.FromArgb(luma,luma,luma));
    }
  }
  return bm;
}

答案 2 :(得分:1)

我们有一个成像组件,可以方便应用多种“效果”,包括简单的颜色操作 - 简单地应用颜色转换矩阵比手动逐像素地移动要快得多,例如......

private static ColorMatrix GrayscaleMatrix = new ColorMatrix(
    new float[][]
    {
        new float[] {0.30f, 0.30f, 0.30f, 0, 0},
        new float[] {0.59f, 0.59f, 0.59f, 0, 0},
        new float[] {0.11f, 0.11f, 0.11f, 0, 0},
        new float[] {0, 0, 0, 1, 0},
        new float[] {0, 0, 0, 0, 1}
    }
);

public static void ApplyGrayscaleTransformation(string inputPath, string outputPath)
{
    using (var image = Bitmap.FromFile(inputPath))
    {
        using (var graphics = Graphics.FromImage(image))
        {
            using (var attributes = new ImageAttributes())
            {
                attributes.SetColorMatrix(GrayscaleMatrix);
                graphics.DrawImage(image, 
                    new Rectangle(0,0,image.Width, image.Height), 
                    0, 0, image.Width, image.Height, GraphicsUnit.Pixel, 
                    attributes);
            }
        }
        image.Save(outputPath);
    }
}

此方法和unsafe方法之间的速度大多可以忽略不计,但可能会有所不同;当它达到这一点时值得测试案例 - 一个好处是不必用/unsafe进行编译。

答案 3 :(得分:-3)