Содержимое трансфера внутри повернутого многоугольника в растровое изображение - PullRequest
3 голосов
/ 07 октября 2019

Я использую C # WinForms. Вращенный многоугольник нарисован на картинке. Ширина и высота повернутого многоугольника равна 101, 101. Теперь я хочу перенести содержимое повернутого многоугольника в новое растровое изображение размером 101,101

enter image description here

Я попытался нарисовать пиксели прямоугольника, используя этот код

 for (int h = 0; h < pictureBox1.Image.Height; h++)
        {
            for (int w = 0; w < pictureBox1.Image.Width; w++)
            {
                if (IsPointInPolygon(rotatedpolygon, new PointF(w, h)))
                {
                    g.FillRectangle(Brushes.Black, w, h, 1, 1); //paint pixel inside polygon
                }                   
            }
        }

Пиксели нарисованы следующим образом: enter image description here

Теперь, как мнезнать, какое место на повернутом прямоугольнике идет в какое место в новом растровом изображении. Вот как я могу перевести пиксельные координаты повернутого прямоугольника в новое растровое изображение.

или, проще говоря, возможно ли отобразить строки и столбцы из повернутого прямоугольника в новое растровое изображение, как показано ниже?

enter image description here

Извините, если вопрос не ясен.

1 Ответ

1 голос
/ 07 октября 2019

То, что вы просите сделать, буквально невозможно. Посмотрите на диаграмму:

enter image description here

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

Итак, давайте просто рассмотрим небольшой фрагмент исходного изображения:

enter image description here

Рассмотрим эти четыре пикселя. На чертеже вы можете видеть, что по горизонтали и вертикали верхний и нижний пиксели перекрывают левый и правый пиксели. Более конкретно, если мы наложим фактическую ориентацию пикселей исходного растрового изображения на предложенные вами местоположения исходных пикселей, мы получим что-то вроде этого:

enter image description here

Asвы можете видеть, когда вы пытаетесь получить значение пикселя, который в конечном итоге станет верхним правым пикселем целевого изображения, вы запрашиваете верхний пиксель в этой группе из четырех. Но этот верхний пиксель фактически состоит из двух разных пикселей исходного изображения!

Суть: если визуальное изображение, которое вы пытаетесь скопировать, будет вращаться в процессе копирования, нет взаимно однозначного соответствия между исходными и целевыми пикселями .

Конечно, алгоритмы повторной выборки, которые обрабатывают этот вид геометрической проекции, действительно применяют концепции , аналогичные тем, которыеты предлагаешь. Но они делают это математически обоснованным способом, при котором пиксели обязательно объединяются или интерполируются по мере необходимости, чтобы отобразить квадратные, горизонтально и вертикально ориентированные пиксели от источника, к квадратным, горизонтально и вертикально ориентированным пикселям в цели. .

Единственный способ получить буквально то, что вы просите - отобразить пиксели один на один без какого-либо изменения самих фактических значений пикселей, - это иметь дисплей, которыйсам вращался.

Теперь все, что говорит: я утверждаю, что вы пытаетесь решить проблему, которая не только не разрешима, но и не стоит решать .

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

Просто сделай это обычным способом. Это будет работать нормально.

...