C# 如何降低图像亮度?

C# 如何降低图像亮度?,c#,.net,graphics,C#,.net,Graphics,我需要用c降低图片的亮度。经过一些分析,我找到了一个解决方案,通过调整每个像素的颜色RGB值来降低图像的亮度。请从下面查找代码: Bitmap bmp = new Bitmap(Picture); Reduce the picture color brightness for (int i = 0; i < bmp.Width; i++) { for (int j = 0; j < bmp.Hei

我需要用c降低图片的亮度。经过一些分析,我找到了一个解决方案,通过调整每个像素的颜色RGB值来降低图像的亮度。请从下面查找代码:

        Bitmap bmp = new Bitmap(Picture);
        Reduce the picture color brightness
        for (int i = 0; i < bmp.Width; i++)
        {
            for (int j = 0; j < bmp.Height; j++)
            {
                Color color = bmp.GetPixel(i, j);
                color = ChangeColorBrightness(color, 0.80f);
                bmp.SetPixel(i, j, color);
            }
        }
Bitmap bmp=新位图(图片);
降低图片颜色亮度
对于(int i=0;i
减少特定颜色的RGB值的方法:

    private Color ChangeColorBrightness(Color color, float correctionFactor)
    {
        float red = (float)color.R;
        float green = (float)color.G;
        float blue = (float)color.B;

        if (correctionFactor < 0)
        {
            correctionFactor = 1 + correctionFactor;
            red *= correctionFactor;
            green *= correctionFactor;
            blue *= correctionFactor;
        }
        else
        {
            red = (255 - red) * correctionFactor + red;
            green = (255 - green) * correctionFactor + green;
            blue = (255 - blue) * correctionFactor + blue;
        }

        return Color.FromArgb(color.A, (int)red, (int)green, (int)blue);
    }
专用颜色更改颜色亮度(颜色、浮动校正因子)
{
浮动红色=(浮动)颜色;
浮动绿色=(浮动)颜色.G;
浮动蓝色=(浮动)颜色;
如果(校正因子<0)
{
校正因子=1+校正因子;
红色*=校正因子;
绿色*=校正因子;
蓝色*=校正因子;
}
其他的
{
红色=(255-红色)*校正因子+红色;
绿色=(255-绿色)*校正因子+绿色;
蓝色=(255-蓝色)*校正因子+蓝色;
}
返回颜色。从argb(颜色A,(内部)红色,(内部)绿色,(内部)蓝色);
}
这些代码可以很好地满足我的要求,但当我执行大量宽度和高度更大的图像时,需要花费大量的时间。 是否有其他可能达到此要求?

.GetPixel()
.SetPixel()
价格昂贵-下面是一个更快的方法

public static Bitmap ChangeColorBrightness(Bitmap bmp, float correctionFactor)
{  
    Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
    System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);
    IntPtr ptr = bmpData.Scan0;
    int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
    byte[] rgbValues = new byte[bytes];
    System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes); 
    float correctionFactortemp = correctionFactor;
    if (correctionFactor < 0)
    {
        correctionFactortemp = 1 + correctionFactor;
    }
    for (int counter = 1; counter < rgbValues.Length; counter ++)
    {
        float color = (float)rgbValues[counter];
        if (correctionFactor < 0)
        {
            color *= (int)correctionFactortemp;
        }
        else
        {
            color = (255 - color) * correctionFactor + color;                  
        }
        rgbValues[counter] = (byte)color;          
    }
    System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
    bmp.UnlockBits(bmpData);
    return bmp;
}
公共静态位图ChangeColorBrightness(位图bmp,浮点校正因子)
{  
矩形rect=新矩形(0,0,bmp.Width,bmp.Height);
System.Drawing.Imaging.BitmapData bmpData=bmp.LockBits(rect,System.Drawing.Imaging.ImageLockMode.ReadWrite,bmp.PixelFormat);
IntPtr ptr=bmpData.Scan0;
int bytes=Math.Abs(bmpData.Stride)*bmp.Height;
字节[]rgbValues=新字节[字节];
System.Runtime.InteropServices.Marshal.Copy(ptr,rgbvalue,0,字节);
浮动校正因子tEMP=校正因子;
如果(校正因子<0)
{
校正因子tTemp=1+校正因子;
}
for(int counter=1;counter
不要设置每个像素,而是通过所需的调整将图像重新绘制到新的像素上。演示如何一次调整亮度、对比度和gamma。感谢您的建议。但是我不喜欢在我的实现中使用图形对象。因此,我忽略了使用颜色矩阵的方法。我不喜欢在我的实现中使用图形对象。没有图形对象有什么可能性吗?@VijayR,这就像你在问,“什么是快速实现这一点的最快方法,但不要告诉我最常见的快速实现方法”推荐的方法是使用颜色矩阵。使用Winforms图形通常意味着一个图形对象。不“喜欢”这是不合理的。在这个解决方案中,图形对象的使用是完全不必要的,而且根本不起任何作用。@TaW你说得对,删除了它