سؤال

أحتاج إلى تحويل الصور النقطية مع نقل نقاط الزاوية الأربعة الخاصة بها من موقع إلى آخر.

أي تعليمات برمجية يمكن تشغيلها على Windows، ويفضل C#/VB.NET، حتى تساعد في كيفية استخدام البرامج النصية مثل الرسام.نت أو محل تصوير سيتم قبوله.تبدو واجهة Java Advanced Imaging API متفائلة.

أحتاجه لنظام معالجة لقطة الشاشة، والذي يسمح لك بالحصول على مثل هذه التأثيرات:

alt text
(مصدر: fulltomato.com)

هل كانت مفيدة؟

المحلول

وتحقق من منظور تزييفها أمثلة من <لأ href = "HTTP: //www.imagemagick.org/ "يختلط =" نوفولو noreferrer "> يماغيماغيك . وهي متاحة لمعظم المنصات الرئيسية.

نصائح أخرى

والكلمة هنا هي <م> homography . وقد كتب مانوليس Lourakis التنفيذ homography الترخيص؟ اد في C الذي هو هنا . ومع ذلك، فإن هذا لن يكون قادرا على أن يكون ميناء بسهولة جدا لأنه يعتمد على بعض المكتبات الخارجية مثل LAPACK .

أسهل من محاكاة تشوه المنظور باستخدام معالجة الصور، يمكنك استخدام OpenGL أو DirectX (XNA) لإجراء عرض المنظور فعليًا.

اعرض شكلًا رباعيًا بسيطًا باستخدام صورتك كخريطة نسيج.قم بإعداد المشهد الخاص بك، ثم قم بتقديمه إلى المخزن المؤقت، وستحصل على صورتك.

تحديث اتضح أن XNA عبارة عن مكتبة سخيفة (موجهة نحو صنع الألعاب ولا شيء آخر، تثاءب).تتطلب إدارة DirectX إجراء عملية جراحية لفص الدماغ.برنامج OpenGL سهل الاستخدام، ولكنه يفتقر إلى كود تحميل الصور.هذا يتركنا مع WPF:

نص بديل http://praeclarum.org/so/persp.png

يمكن تحسين الصورة عن طريق إجبار WPF على وضع مكافحة الاسم المستعار (لماذا يا Microsoft أنت قصير النظر إلى هذا الحد؟)، ومن خلال عدم استخدام زجاج Aero الذي يفرض حدًا أسود يبلغ 1 بكسل على جميع لقطات الشاشة (أو عن طريق إزالة 1 بكسل حدود).

(نأسف لطول هذا الرمز، ولكن WPF عبارة عن واجهة برمجة تطبيقات ثرثرة.)

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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top