2009-03-18 17 views
6

4つのコーナーポイントをある場所から別の場所に移動してビットマップ画像を変換する必要があります。4点変換画像

Windows、C#/ VB.NETで実行できるコードであれば、Paint.NETPhotoshopのようなスクリプト可能なプログラムの使用方法にも役立ちます。 Java Advanced Imaging APIはうまくいくと思います。

私はあなたがこのような効果を得ることができますスクリーンショット操作システム、のためにそれを必要とする:画像操作を使用して視点を歪めるシミュレートするより

alt text http://www.wholetomato.com/images/tour/mondoPerspectiveTrans.gif

答えて

4

ImageMagickからPerspective warping例をチェックしてください。これは、ほとんどのメインストリームプラットフォームで利用できます。

1

簡単、あなたがするのOpenGLやDirectXの(XNA)を使用することができます実際には透視表示を行います。

シンプルクワッドを画像でテクスチャマップとしてレンダリングします。シーンを設定し、バッファにレンダリングし、画像を持っています。

更新 XNAは、ゲームを作ることに向けられたものばかりで、他には何の悪いものでもありません。 Managed DirectXには脳の葉切開が必要です。 OpenGLは使いやすいですが、画像読み込みコードがありません。それは、WPFで私たちを残します:

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

画像が(なぜああ、なぜMicrosoftはとても近視眼的です?)アンチエイリアスモードにWPFを強制することにより、およびエアログラスた力を用いないことによって改善することができますすべてのスクリーンショットで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> 
+0

問題は、どのように4点を3D回転に変換するのですか? –

2

ここでのキーワードはhomographyです。 Manolis LourakisはCでGPLによるホモグラフィの実装を書いています。これはhereです。しかし、これは、LAPACKなどのいくつかの外部ライブラリに依存しているため、非常に簡単に移植することはできません。

2

免責事項:私はあなたが商用行くために喜んでいる場合は、DotImage写真はQuadrilateralWarpCommandでこれを行うことができAtalasoft

で働いています。サンプル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

+0

これはアフィンワープか遠近法ワープですか? –

+0

私はAffineワープ(少なくとも2dではありません)でこれを得ることはできません。私たちはいくつかの一般的なアフィン変換をサポートしており、独自の2Dマトリックスを作ることができます。私たちは3D変換をサポートしていません(マトリックスを使ってこのような変換を行う必要があると思います)。 –

関連する問題