WPF Image Mapping - PullRequest
       5

WPF Image Mapping

1 голос
/ 23 июня 2010

Есть ли способ нарисовать / подогнать простой четырехугольный вырез из изображения на стандартный прямоугольник, выровненный по оси для отображения на экране. (Так что вырез будет искажен, чтобы заполнить точки прямоугольника). Мне кажется, это возможно с помощью ImageBrush, но я не могу этого увидеть.

Ответы [ 2 ]

1 голос
/ 23 июня 2010

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

Выровненный прямоугольник

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

Выровненный прямоугольник или другой параллелограмм

Если четырехугольник является произвольным параллелограммом (включая прямоугольники), вы можете использовать RenderTransform, чтобы отобразить углы четырехугольника на границы прямоугольника и установить ClipToBounds = "True", чтобы отображался только вырез.

<Decorator ClipToBounds="true">
  <Rectangle Fill="{StaticResource SourceImage}" RenderTransform="1 0 0 1 0 0" />
</Decorator>

Путем изменения параметров матрицы в RenderTransform любой параллелограмм может быть сопоставлен с прямоугольником. Простая алгебра даст детали. Просто вставьте любые три угла параллелограмма в матричное уравнение преобразования и определите шесть параметров преобразования.

Произвольный четырехугольник

Если четырехугольник не является параллелограммом, вам нужно использовать неаффинное преобразование, которое недоступно в 2D-графике WPF. Однако он доступен в 3D-системе: вам нужно создать четыре вложенных объекта:

  • MeshGeometry3D для определения формы прямоугольника внутри
  • GeometryModel3D для определения материала (вашего ImageBrush) внутри
  • ModelVisual3D для определения вашего преобразования внутри
  • Viewport3DVisual для определения вашей камеры и области просмотра.

В блоге Чарльза Петцольда приведены расчеты для трехмерного решения.

0 голосов
/ 23 июня 2010

Если вы хотите показать обрезанное изображение, вы можете использовать CroppedBitmap.

...