Перспективное преобразование изображения с тайлингом

В поисках хорошей библиотеки обработки изображений, которую можно использовать для нового приложения, которое я планирую создать. Я буду использовать C#.NET (VS 2008)

Мое приложение должно сделать следующее:

  1. Загружать изображение при запуске и отображать его в окне изображения
  2. Затем я должен иметь возможность выбрать четыре точки (верхняя левая, верхняя правая, нижняя левая, нижняя правая) в любом месте окна изображения.
  3. Затем мне нужно преобразовать исходное изображение в правильную перспективу, используя 4 точки источника и назначения.

Мало того, мне нужно, чтобы конечное выходное изображение имело заданный размер. Я хочу, чтобы приложение могло использовать ту же перспективу и возвращало изображение указанного прямоугольного размера (не размера 4 точки), который я указываю. Надеюсь, вы понимаете, что я имею в виду. Исходное изображение должно быть разбито на мозаику и преобразовано, чтобы получить результат, который полностью соответствует указанной области.

Я пробовал некоторые библиотеки, такие как Aforge.NET, ImageMagick, EMGU и т. д. Некоторые работают медленно. Некоторые могут создавать только перспективное изображение небольшого размера. Некоторые выдают ошибки памяти. Не могу найти подходящее решение.


person over.drive    schedule 20.04.2011    source источник


Ответы (2)


Я предполагаю, что ответ на мой вопрос здесь может помочь и в вашем случае.

person mafu    schedule 20.04.2011
comment
Ну что-то похожее. Но самая большая трудность в том, что я не могу просто растянуть свое преобразованное изображение. По мере увеличения размера необходимо будет использовать новое изображение большего размера, правильно замощенное и имеющее ту же перспективу. Я просто не могу придумать, как этого добиться. Надеюсь, это имеет смысл. - person over.drive; 20.04.2011
comment
Я не уверен, правильно ли я понимаю. Я думаю, что решение там делает то, что вы хотите. Вы смотрели на 3-й пример изображения? - person mafu; 20.04.2011
comment
Это изображение описывает, чего я пытаюсь достичь: 4shared.com/photo/DCp6oFjR/ TiledImage.html - person over.drive; 21.04.2011
comment
Это также должно быть возможно путем копирования исходного изображения несколько раз с правильными координатами - в этом случае местом назначения копирования будет не прямоугольник, а трапеция. Однако вам нужно вычислить координаты по углам камеры самостоятельно, что требует некоторой математики, но не должно быть слишком сложным (если я правильно оцениваю). --- Изображение говорит после преобразования, что является источником? Может быть проще применить исходное изображение, а не преобразованное? - person mafu; 21.04.2011
comment
Да, работал над той же идеей. Я использую исходное изображение, чтобы разбить его несколько раз, чтобы создать изображение большего размера, а затем применить к нему преобразование и вырезать необходимую область. Но есть несколько случаев, когда изображение настолько велико, что когда я пытаюсь применить преобразование, я получаю исключение «наш из памяти». Теперь я пытаюсь ограничить размер сгенерированного изображения и заштриховать оставшуюся часть в финальном изображении. Другого варианта я думаю нет. Спасибо mafutrct за помощь. Очень признателен. - person over.drive; 21.04.2011

Вы можете взглянуть на это, так как это может решить часть вашей проблемы или направить вас в правильном направлении: 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.
    } 
}

К вашему сведению, я считаю, что .NET имеет ограничение на объектную память в 2 ГБ, поэтому, если вы работаете с действительно большими изображениями, вы можете столкнуться с ошибкой памяти.

person Doug S    schedule 12.01.2012