将位图转换为阈值(纯黑色和白色)

时间:2014-07-12 18:50:55

标签: c# asp.net bitmap

我已经尝试过这个代码将位图转换为纯黑色和白色 - 而不是greyScale,但这给了我一个纯黑色图像。

public Bitmap blackwhite(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++) 
    {
    if (source.GetPixel(x, y).GetBrightness() > 0.5f) 
    {
    source.SetPixel(x,y,Color.White); 
    } 
    else  
    {
    source.SetPixel(x,y,Color.Black);  
    } 
    } 
    } 
    return bm; 
    }

什么会导致这样的问题?有没有替代方法呢?

1 个答案:

答案 0 :(得分:1)

我知道这个答案为时已晚,但我只是想出来并希望它可以帮助其他人解决这个问题。

我得到图片的平均亮度,并将其用作将像素设置为黑色或白色的阈值。它不是100%准确,并且绝对没有针对时间复杂性进行优化,但它完成了工作。

public static void GetBitmap(string file)
        {
            using (Bitmap img = new Bitmap(file, true))
            {    
                // Variable for image brightness
                double avgBright = 0;
                for (int y = 0; y < img.Height; y++)
                {
                    for (int x = 0; x < img.Width; x++)
                    {
                        // Get the brightness of this pixel
                        avgBright += img.GetPixel(x, y).GetBrightness();
                    }
                }

                // Get the average brightness and limit it's min / max
                avgBright = avgBright / (img.Width * img.Height);
                avgBright = avgBright < .3 ? .3 : avgBright;
                avgBright = avgBright > .7 ? .7 : avgBright;

                // Convert image to black and white based on average brightness
                for (int y = 0; y < img.Height; y++)
                {
                    for (int x = 0; x < img.Width; x++)
                    {
                        // Set this pixel to black or white based on threshold
                        if (img.GetPixel(x, y).GetBrightness() > avgBright) img.SetPixel(x, y, Color.White);
                        else img.SetPixel(x, y, Color.Black);
                    }
                }

                // Image is now in black and white
            }