Frage

ich brauche Bitmap-Bilder mit ihren vier Eckpunkten von einem Ort zum anderen bewegt zu machen.

Jeder Code, der unter Windows ausgeführt werden kann, C # / VB.NET bevorzugt, auch helfen, wie skriptfähige Programme zu verwenden, wie Photoshop akzeptiert werden würde. Die Java Advanced Imaging API klingt hoffnungsvoll.

Ich brauche es für ein Screenshot Manipulationssystem, mit dem Sie solche Effekte erhalten kann:


(Quelle: wholetomato.com )

War es hilfreich?

Lösung

Schauen Sie sich die Perspektive Beispiele von ImageMagick . Es ist für die meisten Mainstream-Plattformen.

Andere Tipps

Das Schlüsselwort hier ist Homografie . Manolis Lourakis hat eine GPL'ed Homografie Implementierung in C geschrieben, die verfügbar hier ; dies jedoch nicht in der Lage sein, sehr leicht portiert werden, da es auf einigen externen Bibliotheken wie LAPACK .

Disclaimer: Ich bei Atalasoft arbeiten

Wenn Sie bereit sind, kommerziell zu gehen, kann DotImage Photo dies mit der QuadrilateralWarpCommand. Probe C # -Code

// 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

Einfacher als eine Perspektive zu simulieren Bildmanipulation verzerren verwenden, können Sie OpenGL oder DirectX (XNA) verwenden, um tatsächlich die Perspektive Anzeige durchführen.

Render ein einfaches Quad mit Ihrem Bild als Textur Karte. Richten Sie Ihre Szene, machen auf einen Puffer, und Sie haben Ihr Bild.

Aktualisieren Es stellt sich heraus, dass XNA eine lächerliche Bibliothek ist (ausgerichtet auf andere Spiele und nichts machen, gähn). Managed DirectX erfordert ein Gehirn Lobotomie. OpenGL ist einfach zu bedienen, aber es fehlt Bild Laden-Code. Das lässt uns mit WPF:

alt text http://praeclarum.org/so/persp.png

Das Bild wird durch Zwingen WPF in Anti-Aliasing-Modus verbessert werden könnte (warum oh warum Microsoft sind Sie so kurzsichtig?) Und von nicht Aero Glas verwendet, die Kräfte, die 1 Pixel schwarzer Rand auf allen Screenshots (oder durch Entfernen dass 1 Pixel Grenze).

(Sorry für die Länge dieses Codes, aber WPF ist ein gesprächig 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];
    }
}

Und die erforderliche 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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top