Изображения преобразования с 4 точками

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

Если в вашем пользовательском интерфейсе есть элементы, которые по умолчанию свернуты, все еще создается при запуске, даже если они не видны. Вы можете отложить загрузку этих элементов, пока они не отобразятся, установив для атрибута x: DeferLoadStrategy значение «Lazy». Это может улучшить производительность при запуске. Для получения дополнительной информации см. Атрибут x: DeferLoadStrategy.

blockquote>

Источник: https://docs.microsoft.com/de-de/windows/uwp/design/layout/layouts-with-xaml

6
задан Glorfindel 7 March 2019 в 08:00
поделиться

4 ответа

Проверьте Перспективные примеры деформирования от ImageMagick. Это доступно для большинства основных платформ.

4
ответ дан 10 December 2019 в 02:53
поделиться

Ключевое слово здесь является homography. Manolis Lourakis записал реализацию homography GPL'ed в C, который доступен здесь; однако, это не сможет быть портированным очень легко, потому что это полагается на некоторые внешние библиотеки, такие как LAPACK.

2
ответ дан 10 December 2019 в 02:53
поделиться

Отказ от ответственности: Я работаю в Atalasoft

Если Вы готовы пойти коммерческие, фотография DotImage может сделать это с QuadrilateralWarpCommand. Демонстрационный Код C#

// Load an image.
AtalaImage image = new AtalaImage("test-image.jpg");

// Prepare the warp positions.
Point bottomLeft = new Point(100, image.Height - 80);
Point topLeft = new Point(130, 45);
Point topRight = new Point(image.Width - 60, 140);
Point bottomRight = new Point(image.Width - 20, image.Height);

// Warp the image.
QuadrilateralWarpCommand cmd = new QuadrilateralWarpCommand(bottomLeft,
   topLeft, topRight, bottomRight, InterpolationMode.BiLinear, Color.White);
AtalaImage result = cmd.Apply(image).Image;

http://www.atalasoft.com/products/dotimage

2
ответ дан 10 December 2019 в 02:53
поделиться

Легче, чем моделирование перспективы искажают обработку изображения использования, Вы могли использовать OpenGL или DirectX (XNA) для фактического выполнения перспективного дисплея.

Представьте простую четверку со своим изображением как текстурная карта. Установите свою сцену, рендеринг к буферу, и у Вас есть свое изображение.

Обновление оказывается, что XNA является смешной библиотекой (приспособленный к созданию игр и ничего иного, зевка). Управляемый DirectX требует мозговой лоботомии. OpenGL прост в использовании, но испытывает недостаток в изображении, загружающем код. Это оставляет нас с WPF:

сопроводительный текст http://praeclarum.org/so/persp.png

Изображение могло быть улучшено путем принуждения WPF в режим сглаживания (почему, о, почему Microsoft - Вы таким образом близорукий?), и не используя Аэро стекло, которое вызывает ту черную границу на 1 пиксель на всех снимках экрана (или путем удаления той границы на 1 пиксель).

(Извините за длину этого кода, но WPF болтливый API.)

public partial class Window1 : Window {
    const float ANGLE = 30;
    const float WIDTH = 8;
    public Window1() {
        InitializeComponent();

        var group = new Model3DGroup();
        group.Children.Add(Create3DImage(@"C:\Users\fak\Pictures\so2.png"));
        group.Children.Add(new AmbientLight(Colors.White));

        ModelVisual3D visual = new ModelVisual3D();
        visual.Content = group;
        viewport.Children.Add(visual);
    }

    private GeometryModel3D Create3DImage(string imgFilename) {
        var image = LoadImage(imgFilename);

        var mesh = new MeshGeometry3D();
        var height = (WIDTH * image.PixelHeight) / image.PixelWidth;
        var w2 = WIDTH / 2.0;
        var h2 = height / 2.0;
        mesh.Positions.Add(new Point3D(-w2, -h2, 0));
        mesh.Positions.Add(new Point3D(w2, -h2, 0));
        mesh.Positions.Add(new Point3D(w2, h2, 0));
        mesh.Positions.Add(new Point3D(-w2, h2, 0));
        mesh.TriangleIndices.Add(0);
        mesh.TriangleIndices.Add(1);
        mesh.TriangleIndices.Add(2);
        mesh.TriangleIndices.Add(0);
        mesh.TriangleIndices.Add(2);
        mesh.TriangleIndices.Add(3);
        mesh.TextureCoordinates.Add(new Point(0, 1)); // 0, 0
        mesh.TextureCoordinates.Add(new Point(1, 1));
        mesh.TextureCoordinates.Add(new Point(1, 0));
        mesh.TextureCoordinates.Add(new Point(0, 0));

        var mat = new DiffuseMaterial(new ImageBrush(image));
        mat.AmbientColor = Colors.White;

        var geometry = new GeometryModel3D();
        geometry.Geometry = mesh;
        geometry.Material = mat;
        geometry.BackMaterial = mat;

        geometry.Transform = new RotateTransform3D(
            new AxisAngleRotation3D(new Vector3D(0,1,0), ANGLE),
            new Point3D(0, 0, 0));

        return geometry;
    }

    public static BitmapSource LoadImage(string filename) {
        return BitmapDecoder.Create(new Uri(filename, UriKind.RelativeOrAbsolute),
            BitmapCreateOptions.None, BitmapCacheOption.Default).Frames[0];
    }
}

И необходимый XAML:

<Window x:Class="Persp.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Perspective Window" Height="480" Width="640">
<Grid>
    <Viewport3D x:Name="viewport">
        <Viewport3D.Resources>
        </Viewport3D.Resources>
        <Viewport3D.Camera>
            <PerspectiveCamera x:Name="cam"
                  FarPlaneDistance="100"
                  LookDirection="0,0,-1"
                  UpDirection="0,1,0"
                  NearPlaneDistance="1"
                  Position="0,0,10"
                  FieldOfView="60" />
        </Viewport3D.Camera>
    </Viewport3D>
</Grid>
</Window>
1
ответ дан 10 December 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: