Сдвиг изображения в WPF - PullRequest
       37

Сдвиг изображения в WPF

1 голос
/ 29 сентября 2010

Я пытаюсь обрезать изображение в WPF (C #), используя чистый XAML. Я использовал такие преобразования, как перекос, масштаб и матрица, но я не получаю желаемый результат. Ниже приведен код, который я использую

         <Image Source="G:\Demo\virtualization\virtualization\img3.bmp" Stretch="Fill" Height="70" Width="240" Margin="0,170,-312,-29" >
            <Image.RenderTransform>
                <TransformGroup>
                    <MatrixTransform Matrix="1,.1,-4.2,1,0,0" />
                    <!--<ScaleTransform ScaleX=".2" ScaleY=".6"/>-->
                </TransformGroup>
            </Image.RenderTransform>
        </Image>

С приведенным выше кодом, ниже аналогичный эффект, который я получаю:

   /----/
  /    /
 /    /
/----/

Но я хочу следующий эффект:

     /---\
    /     \
   /       \
  /---------\

Из-за нового пользователя я не могу публиковать изображения прямо сейчас ...

Спасибо

EDIT:

Я пробовал viewport3d, чтобы получить этот эффект. Ниже приведен код:

<Grid>
        <Image Source="G:\Demo\virtualization\virtualization\2.jpg"/>
        <Viewport3D Name="mainViewport" ClipToBounds="True" HorizontalAlignment="Stretch" Height="300">
            <Viewport3D.Camera>
                    <PerspectiveCamera Position="0, 0, 20"  />
            </Viewport3D.Camera>
            <Viewport2DVisual3D>
                <Viewport2DVisual3D.Transform>
                    <MatrixTransform3D Matrix="1,0,0,0 
                                               0,1,0,0 
                                               0,0,1,0
                                               0,0,0,1" />
                </Viewport2DVisual3D.Transform>

                <Viewport2DVisual3D.Geometry>
                    <MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0"
                            TextureCoordinates="0,0 0,1 1,1 1,0" TriangleIndices="0 1 2 0 2 3"/>
                </Viewport2DVisual3D.Geometry>

                <Viewport2DVisual3D.Material>
                    <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True" Brush="White"/>
                </Viewport2DVisual3D.Material>
                <Grid>

                <Image Source="G:\Demo\virtualization\virtualization\img3.bmp"/>
                </Grid>

            </Viewport2DVisual3D>

            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <DirectionalLight Color="#FFFFFFFF" Direction="0,-1,-1"/>
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>
    </Grid>

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

Ответы [ 2 ]

2 голосов
/ 29 сентября 2010

Вы не можете достичь такого эффекта с помощью линейного преобразования (математически невозможно).

Вы можете получить этот эффект с WPF 3D.

0 голосов
/ 30 сентября 2010

Вы можете добиться этого эффекта с помощью пользовательского пиксельного шейдера.

Загрузите копию Shazzam (это бесплатно) и ознакомьтесь с образцом бумажной складки (shazzam-tool.com).Хотя это не совсем тот эффект сдвига, который вы показали в своем вопросе, он близок.

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

Редактировать

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

Список статей шейдеров можно найти по адресу http://blog.shazzam -tool.com / index.php / shader-article /

...