透视图像失真

时间:2011-04-17 10:18:19

标签: c# .net image perspective

我正在处理的应用程序目前需要Perspective Image Distortion的功能。基本上我想要做的是允许用户将图像加载到应用程序中,并根据他们可以指定的4个角点调整其透视图属性。

我看了一下ImageMagic。它有一些扭曲功能,可以进行调整,但速度非常慢,某些输入输出不正确。

你们中的任何人都使用过任何其他库或算法。我在C#编码。

任何指针都会非常感激。

由于

5 个答案:

答案 0 :(得分:6)

这似乎正是你(和我)正在寻找的: http://www.codeproject.com/KB/graphics/YLScsFreeTransform.aspx

它会拍摄一张图像并使用您提供的4个X / Y坐标对其进行扭曲。

快速,免费,简单的代码。经过测试,效果很好。只需从链接下载代码,然后使用FreeTransform.cs,如下所示:

using (System.Drawing.Bitmap sourceImg = new System.Drawing.Bitmap(@"c:\image.jpg")) 
{ 
    YLScsDrawing.Imaging.Filters.FreeTransform filter = new YLScsDrawing.Imaging.Filters.FreeTransform(); 
    filter.Bitmap = sourceImg;
    // assign FourCorners (the four X/Y coords) of the new perspective shape
    filter.FourCorners = new System.Drawing.PointF[] { new System.Drawing.PointF(0, 0), new System.Drawing.PointF(300, 50), new System.Drawing.PointF(300, 411), new System.Drawing.PointF(0, 461)}; 
    filter.IsBilinearInterpolation = true; // optional for higher quality
    using (System.Drawing.Bitmap perspectiveImg = filter.Bitmap) 
    {
        // perspectiveImg contains your completed image. save the image or do whatever.
    } 
} 

答案 1 :(得分:2)

Paint .NET可以执行此操作,还有custom implementations of the effect。您可以要求提供源代码或使用Reflector读取它并了解如何编写它。

答案 2 :(得分:2)

如果是透视变换,您应该能够指定与四个角匹配的4x4变换矩阵。

计算该矩阵,然后将结果图像上的每个像素应用于矩阵,从而生成“映射”像素。请注意,此“映射”像素很可能位于两个甚至四个像素之间。在这种情况下,使用您最喜欢的插值算法(例如双线性,双三次)来获得插值颜色。

这确实是完成它的唯一方法,不能更快地完成。如果此功能至关重要且绝对需要快速,那么您需要将任务卸载到GPU。例如,您可以调用DirectX库对纹理应用透视变换。这可以使它非常快,即使没有GPU,因为DirectX库使用SIMD指令来加速矩阵计算和颜色插值。

答案 3 :(得分:1)

有同样的问题。以下是demo代码,其源代码来自gimp

答案 4 :(得分:1)

YLScsFreeTransform无法按预期工作。更好的解决方案是ImageMagic

以下是在c#中使用它的方法:

using(MagickImage image = new MagickImage("test.jpg"))
{
    image.Distort(DistortMethod.Perspective, new double[] { x0,y0, newX0,newY0, x1,y1,newX1,newY1, x2,y2,newX2,newY2, x3,y3,newX3,newY3 });
    control.Image = image.ToBitmap();
}