Искажение перспективного изображения - PullRequest
4 голосов
/ 17 апреля 2011

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

Я посмотрел на ImageMagic.Он имеет некоторые функции искажения с соответствующей настройкой, но очень медленный, и некоторые определенные входные данные дают неправильные выходные данные.

Любой из вас, ребята, использовал любую другую библиотеку или алгоритм.Я кодирую на C #.

Любые указатели будут высоко оценены.

Спасибо

Ответы [ 5 ]

6 голосов
/ 12 января 2012

Похоже, это именно то, что вы (и я) искали: 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.
    } 
} 
2 голосов
/ 17 апреля 2011

Если это перспективное преобразование, вы сможете указать матрицу преобразования 4x4, которая соответствует четырем углам.

Рассчитать эту матрицу, а затем применить каждый пиксель к результирующему изображению в матрице, что приведет к«сопоставленный» пиксель.Обратите внимание, что этот «сопоставленный» пиксель, скорее всего, будет лежать между двумя или даже четырьмя пикселями.В этом случае используйте ваш любимый алгоритм интерполяции (например, билинейный, бикубический), чтобы получить интерполированный цвет.

Это действительно единственный способ сделать это и не может быть сделан быстрее.Если эта функция имеет решающее значение, и вам абсолютно нужно, чтобы она была быстрой, то вам нужно перенести задачу в графический процессор.Например, вы можете вызвать библиотеку DirectX для применения преобразования перспективы к текстуре.Это может сделать его чрезвычайно быстрым, даже когда нет графического процессора, поскольку библиотека DirectX использует инструкции SIMD для ускорения матричных вычислений и цветовой интерполяции.

2 голосов
/ 17 апреля 2011

Paint .NET может сделать это, и есть также пользовательские реализации эффекта . Вы можете запросить исходный код или использовать Reflector, чтобы прочитать его и получить представление о том, как его кодировать.

1 голос
/ 03 апреля 2015

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();
}
1 голос
/ 19 ноября 2014

Была такая же проблема.Вот код demo с источниками, портированными из gimp .

...