屏幕截图转换为灰度不起作用。是什么导致这个?

问题描述 投票:0回答:2

我有一个Windows窗体应用程序,它截取屏幕特定部分的屏幕截图,然后将其显示在图片框(pictureBox1)中。它适用于我不尝试转换它,但我想将图像转换为灰度或黑白。问题是当我将其转换为灰度时,它仍然显示图片框中的原始图片。

这是代码工作时没有转换:

private void button1_Click(object sender, EventArgs e)
{
        Rectangle rectangle = new Rectangle(660, 200, 600, 100);
        pictureBox1.Height = rectangle.Height;
        pictureBox1.Width = rectangle.Width;

        imageUploader(rectangle);
}

public void imageUploader(Rectangle rectangle)
{
        Bitmap bitmap = new Bitmap(rectangle.Width, rectangle.Height, PixelFormat.Format32bppArgb);
        Graphics graphics = Graphics.FromImage(bitmap);
        graphics.CopyFromScreen(rectangle.Left, rectangle.Top, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy);

        bitmap.Save("proba.jpeg", ImageFormat.Jpeg);

        pictureBox1.Image = bitmap;
} 

这是转换方法,我尝试过:

public void toGrayscale(Bitmap bitmap)
    {
        Color c;

        for (int y = 0; y < bitmap.Height; y++)
        {
            for (int x = 0; x < bitmap.Width; x++)
            {
                c = bitmap.GetPixel(x,y);
                Color newColor = Color.FromArgb(c.R,0,0);
                bitmap.SetPixel(x,y,newColor);
            }
        }
    }

在我使用此转换(见下文)后,图像显示在图片框中,但它不是灰度。

以下是修改后的imageUploader void以及转换:

    public void imageUploader(Rectangle rectangle)
    {
        Bitmap bitmap = new Bitmap(rectangle.Width, rectangle.Height, PixelFormat.Format32bppArgb);
        toGrayscale(bitmap);
        Graphics graphics = Graphics.FromImage(bitmap);
        graphics.CopyFromScreen(rectangle.Left, rectangle.Top, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy);

        bitmap.Save("proba.jpeg", ImageFormat.Jpeg);

        pictureBox1.Image = bitmap;
    } 
c# image picturebox grayscale
2个回答
0
投票

您的问题似乎在这里:

    public void imageUploader(Rectangle rectangle)
    {
        Bitmap bitmap = new Bitmap(rectangle.Width, rectangle.Height, PixelFormat.Format32bppArgb);
        toGrayscale(bitmap);
        Graphics graphics = Graphics.FromImage(bitmap);
        graphics.CopyFromScreen(rectangle.Left, rectangle.Top, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy);

        bitmap.Save("proba.jpeg", ImageFormat.Jpeg);

        pictureBox1.Image = bitmap;
    }

您将位图的每个像素转换为灰度(奇怪的是,它看起来只是抓取红色通道),然后从屏幕复制,这会覆盖您的转换。要修复它,您需要做的就是从屏幕复制后移动toGreyscale,如下所示:

    public void imageUploader(Rectangle rectangle)
    {
        Bitmap bitmap = new Bitmap(rectangle.Width, rectangle.Height, PixelFormat.Format32bppArgb);
        Graphics graphics = Graphics.FromImage(bitmap);
        graphics.CopyFromScreen(rectangle.Left, rectangle.Top, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy);
        toGrayscale(bitmap);  # Moved after the copy from screen
        bitmap.Save("proba.jpeg", ImageFormat.Jpeg);

        pictureBox1.Image = bitmap;
    }

这应该解决问题。


0
投票

您正在将空位图转换为灰度,然后使用屏幕上的图像复制(标称)灰度位图。这是您的代码,注释用于描述它正在做什么:

// This line creates an empty Bitmap.
Bitmap bitmap = new Bitmap(rectangle.Width, rectangle.Height, PixelFormat.Format32bppArgb);
// This line converts the empty Bitmap to grayscale.
toGrayscale(bitmap);
// This line creates a Graphics drawing surface from your bitmap.
Graphics graphics = Graphics.FromImage(bitmap);
// This line overwrites the image data from your bitmap with an image from the screen.
graphics.CopyFromScreen(rectangle.Left, rectangle.Top, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy);

您需要找到一些方法来获取从屏幕获得的数据并使其成为灰度。你还没有这样做。你制作了一个灰度图像,但是你通过在其上面写入其他数据就把它扔掉了。碰巧的是,替换数据不是灰度级的。

© www.soinside.com 2019 - 2024. All rights reserved.