Преобразование снимка экрана в оттенки серого не работает. Что вызывает это? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть приложение Windows Forms, которое делает снимок экрана определенной части экрана, а затем отображает его в графическом окне (pictureBox1).Это работает, когда я не пытаюсь преобразовать его, но я хочу преобразовать изображение в оттенки серого или черно-белое изображение.Проблема в том, что когда я конвертирую его в оттенки серого, он по-прежнему показывает исходное изображение в графическом окне.

Here is a picture, how the application looks when it runs properly

Вот код, когда он работает, без преобразования:

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);
            }
        }
    }

После того, как я использовал это преобразование (см. Ниже), изображение появилось в окне изображения, но оно не былооттенки серого.

Вот модифицированное изображение vUploader 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;
    } 

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Похоже, что ваша проблема здесь:

    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 голосов
/ 03 апреля 2019

Вы преобразуете пустое растровое изображение в оттенки серого, а затем копируете (номинально) растровое изображение в оттенках серого с изображением с экрана. Вот ваш код, аннотированный для описания того, что он делает:

// 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);

Вам нужно найти способ взять данные, которые вы получили с экрана, и сделать их в оттенках серого. Вы этого не сделали. Вы создали изображение в оттенках серого, но затем выбросили его, написав другие данные поверх него. Случается, что эти данные замены не являются оттенками серого.

...