Что означает «шаг» в растровом изображении? Небольшой код выбора цвета с комментариями, указывающими строку, о которой идет речь - PullRequest
0 голосов
/ 07 февраля 2020

Я понимаю, что делает следующий код, но я не совсем понимаю каждую строку. Надеюсь, вы, ребята, можете помочь мне с строкой, в которой есть метод CopyPixels, в частности, что делает параметр шага. Не стесняйтесь помогать с другими строками, которые имеют комментарий, если вы будете sh. Очень ценится

BitmapSource bitmapSource = ColorSquare.Source as BitmapSource;
            if (bitmapSource != null)
            {
                double x = Mouse.GetPosition(ColorSquare).X;

                //This next line is confusing. It seems like I'm just dividing an image by itself
                //say the image width is 4 and since I'm using it as the bitmap source the
                //both the PixelWidth and the ActualWidth will = 4, right? Basically x *= 1;
                x *= bitmapSource.PixelWidth / ColorSquare.ActualWidth;

                if ((int)x > bitmapSource.PixelWidth - 1)
                    x = bitmapSource.PixelWidth - 1;
                else if (x < 0) x = 0;
                double y = Mouse.GetPosition(ColorSquare).Y;
                y *= bitmapSource.PixelHeight / ColorSquare.ActualHeight;
                if ((int)y > bitmapSource.PixelHeight - 1)
                    y = bitmapSource.PixelHeight - 1;
                else if (y < 0) y = 0;
                CroppedBitmap cb = new CroppedBitmap(bitmapSource, new Int32Rect((int)x, (int)y, 1, 1));
                byte[] pixels = new byte[4];

                //What is the stride and why does it need to be 4?
                cb.CopyPixels(pixels, 4, 0);
                if (pixels[3] == byte.MaxValue)
                {
                    //So it seems we are passing all 4 pixels we copied earlier into the array
                    //here. This would be the Alpha,Red,Green,Blue of a color. So is that what stride does?
                    color = Color.FromArgb(pixels[3], pixels[2], pixels[1], pixels[0]);
                }
            }

1 Ответ

2 голосов
/ 07 февраля 2020

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

Тем не менее, давайте копать глубже

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

enter image description here

Что применяется к Pixel Stride, количество байтов, которое пиксель занимает в памяти. Изображение 32 бита на пиксель будет иметь 4 байта (32 бита) или Uint на пиксель.

Сводка

  • адрес пикселя - адрес пикселя в памяти
  • глубина пикселя - количество бит на пиксель (содержащее ценную информацию)
  • шаг пикселя - количество байтов, занимаемых в памяти пикселем изображения
  • данных begin - адрес первого пикселя изображения в памяти
  • каналов - количество каналов изображения (3 для RGB-изображения)
  • channel_address - адрес определенного пиксельного канала в памяти
  • высота - высота изображения в пикселях
  • ширина - ширина изображения в пикселях
  • шаг строки - количество байтов, занятое в памяти строкой изображения

Дополнительные ресурсы

CopyPixels (Array, Int32, Int32)

Копирует данные пикселей растрового изображения в массив пикселей с Указанный шаг, начиная с указанного смещения.

Параметры

  • пикселей - Array Массив назначения.

  • шаг - Int32 шаг растрового изображения.

  • смещение - Int32 Пиксельное местоположение, с которого начинается копирование.

...