C#图片转换为 灰度位图

时间:2022-11-11 21:02:04
如何将普通的图片转换为灰度位图呢?在网上搜过些例子 但是转换后图像都变了!

13 个解决方案

#1


求大侠出现啊!!!

#2


该回复于2011-03-30 10:05:14被版主删除

#3


ControlPaint.DrawDisabledImage()
系统自带该功能

#4


引用 3 楼 dylike 的回复:
ControlPaint.DrawDisabledImage()
系统自带该功能


还有这个的啊

#5


引用 3 楼 dylike 的回复:
ControlPaint.DrawDisabledImage()
系统自带该功能

是DrawImageDisabled吧,不过还真没试过。

#6


这个嘛,自己可以写个方法的,但是,在C#里面处理图片,建议在unsafe下面用指针,这样的话,运行的速度很快,否则,你处理大点的图片,你会很纠结的,当然,要先你的项目里面,设置,允许不安全代码...

//打开图片,并保存为位图
Bitmap thismap= (Bitmap)Image.FromFile("你的图片文件名");

Rectangle rect = new Rectangle(0, 0, thisMap.Width, thisMap.Height);
                BitmapData bmpData = thisMap.LockBits(rect, ImageLockMode.ReadWrite, thisMap.PixelFormat);
                byte temp = 0;
                unsafe
                {
                    //运用指针来处理图片
                    byte* ptr = (byte*)(bmpData.Scan0);
                    for (int i = 0; i < bmpData.Height; i++)
                    {
                        for (int j = 0; j < bmpData.Width; j++)
                        {
                            temp = (byte)(0.299 * ptr[2] + 0.587 * ptr[1] + 0.114 * ptr[0]);//灰度化公式,方法大致有三种,这里用的是加权平均法
                            ptr[0] = ptr[1] = ptr[2] = temp;
                            ptr += 4;//这里的4,是指每个像素的字节数
                        }
                        ptr += bmpData.Stride - bmpData.Width * 4;//偏移量
                    }
                }
                thisMap.UnlockBits(bmpData);
                pictruebox1.Image=this.Map;//显示处理后的灰度图


试试吧,应该没问题

#7


该回复于2011-03-30 09:02:21被版主删除

#8


楼主意思是把彩色改为黑白吗

#9


一直在用的一个方法:

        public static Image MakeGrayscale(Image image)
        {
            // source: http://www.switchonthecode.com/tutorials/csharp-tutorial-convert-a-color-image-to-grayscale

            //create a blank bitmap the same size as original
            Bitmap newBitmap = new Bitmap(image.Width, image.Height);

            //get a graphics object from the new image
            Graphics g = Graphics.FromImage(newBitmap);

            //create the grayscale ColorMatrix
            ColorMatrix colorMatrix = new ColorMatrix(
               new float[][] 
                  {
                     new float[] {.3f, .3f, .3f, 0, 0},
                     new float[] {.59f, .59f, .59f, 0, 0},
                     new float[] {.11f, .11f, .11f, 0, 0},
                     new float[] {0, 0, 0, 1, 0},
                     new float[] {0, 0, 0, 0, 1}
                  });

            //create some image attributes
            ImageAttributes attributes = new ImageAttributes();

            //set the color matrix attribute
            attributes.SetColorMatrix(colorMatrix);

            //draw the original image on the new image
            //using the grayscale color matrix
            g.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height),
               0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);

            //dispose the Graphics object
            g.Dispose();
            attributes.Dispose();

            return newBitmap;
        }

#10


该回复于2011-03-30 09:12:41被版主删除

#11


这个也只是按照公式进行灰度化,并没有把图像变为8位灰度图像。不过这个方法好特别哦,从没想过用ImageAttributes去完成什么。
引用 9 楼  的回复:
一直在用的一个方法:
C# code

        public static Image MakeGrayscale(Image image)
        {
            // source: http://www.switchonthecode.com/tutorials/csharp-tutorial-convert-a-color-image-to-graysca……

#12


引用 11 楼  的回复:
这个也只是按照公式进行灰度化,并没有把图像变为8位灰度图像。不过这个方法好特别哦,从没想过用ImageAttributes去完成什么。
引用 9 楼  的回复:

一直在用的一个方法:
C# code

public static Image MakeGrayscale(Image image)
{
// source: http://www.switchonthecode.co……



修改生成位图的索引表,从伪彩修改为灰度

#13


ControlPaint.DrawImageDisabled();

#1


求大侠出现啊!!!

#2


该回复于2011-03-30 10:05:14被版主删除

#3


ControlPaint.DrawDisabledImage()
系统自带该功能

#4


引用 3 楼 dylike 的回复:
ControlPaint.DrawDisabledImage()
系统自带该功能


还有这个的啊

#5


引用 3 楼 dylike 的回复:
ControlPaint.DrawDisabledImage()
系统自带该功能

是DrawImageDisabled吧,不过还真没试过。

#6


这个嘛,自己可以写个方法的,但是,在C#里面处理图片,建议在unsafe下面用指针,这样的话,运行的速度很快,否则,你处理大点的图片,你会很纠结的,当然,要先你的项目里面,设置,允许不安全代码...

//打开图片,并保存为位图
Bitmap thismap= (Bitmap)Image.FromFile("你的图片文件名");

Rectangle rect = new Rectangle(0, 0, thisMap.Width, thisMap.Height);
                BitmapData bmpData = thisMap.LockBits(rect, ImageLockMode.ReadWrite, thisMap.PixelFormat);
                byte temp = 0;
                unsafe
                {
                    //运用指针来处理图片
                    byte* ptr = (byte*)(bmpData.Scan0);
                    for (int i = 0; i < bmpData.Height; i++)
                    {
                        for (int j = 0; j < bmpData.Width; j++)
                        {
                            temp = (byte)(0.299 * ptr[2] + 0.587 * ptr[1] + 0.114 * ptr[0]);//灰度化公式,方法大致有三种,这里用的是加权平均法
                            ptr[0] = ptr[1] = ptr[2] = temp;
                            ptr += 4;//这里的4,是指每个像素的字节数
                        }
                        ptr += bmpData.Stride - bmpData.Width * 4;//偏移量
                    }
                }
                thisMap.UnlockBits(bmpData);
                pictruebox1.Image=this.Map;//显示处理后的灰度图


试试吧,应该没问题

#7


该回复于2011-03-30 09:02:21被版主删除

#8


楼主意思是把彩色改为黑白吗

#9


一直在用的一个方法:

        public static Image MakeGrayscale(Image image)
        {
            // source: http://www.switchonthecode.com/tutorials/csharp-tutorial-convert-a-color-image-to-grayscale

            //create a blank bitmap the same size as original
            Bitmap newBitmap = new Bitmap(image.Width, image.Height);

            //get a graphics object from the new image
            Graphics g = Graphics.FromImage(newBitmap);

            //create the grayscale ColorMatrix
            ColorMatrix colorMatrix = new ColorMatrix(
               new float[][] 
                  {
                     new float[] {.3f, .3f, .3f, 0, 0},
                     new float[] {.59f, .59f, .59f, 0, 0},
                     new float[] {.11f, .11f, .11f, 0, 0},
                     new float[] {0, 0, 0, 1, 0},
                     new float[] {0, 0, 0, 0, 1}
                  });

            //create some image attributes
            ImageAttributes attributes = new ImageAttributes();

            //set the color matrix attribute
            attributes.SetColorMatrix(colorMatrix);

            //draw the original image on the new image
            //using the grayscale color matrix
            g.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height),
               0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);

            //dispose the Graphics object
            g.Dispose();
            attributes.Dispose();

            return newBitmap;
        }

#10


该回复于2011-03-30 09:12:41被版主删除

#11


这个也只是按照公式进行灰度化,并没有把图像变为8位灰度图像。不过这个方法好特别哦,从没想过用ImageAttributes去完成什么。
引用 9 楼  的回复:
一直在用的一个方法:
C# code

        public static Image MakeGrayscale(Image image)
        {
            // source: http://www.switchonthecode.com/tutorials/csharp-tutorial-convert-a-color-image-to-graysca……

#12


引用 11 楼  的回复:
这个也只是按照公式进行灰度化,并没有把图像变为8位灰度图像。不过这个方法好特别哦,从没想过用ImageAttributes去完成什么。
引用 9 楼  的回复:

一直在用的一个方法:
C# code

public static Image MakeGrayscale(Image image)
{
// source: http://www.switchonthecode.co……



修改生成位图的索引表,从伪彩修改为灰度

#13


ControlPaint.DrawImageDisabled();