Как обрезать наклонное изображение в C#
У меня есть захват изображения наклона с помощью мобильного телефона. Я хочу разрезать участок / часть изображения между двумя прямоугольниками с обеих сторон, чтобы найти круги между ними. У меня есть все 4 координаты средней части, такие как (x0,y0),(x1,y1),(x2,y2),(x3,y3).
Но функция обрезки у меня что-то вроде
public static Bitmap CropImage(int x, int y, int width, int height, Bitmap bitmap)
{
Bitmap croppedImage;
var originalImage = bitmap;
{
Rectangle crop = new Rectangle(x, y, width, height);
croppedImage = originalImage.Clone(crop, originalImage.PixelFormat);
} // Here we release the original resource - bitmap in memory and file on disk.
return croppedImage;
}
Но выше функция обрезает часть в виде прямоугольника, как показано в 1-й и 2-й красной рамке.
Я ищу код для вырезания части, показанной в 3-м красном прямоугольнике. У меня был поиск кода и узнать код ниже
List<IntPoint> corners = new List<IntPoint>();
corners.Add(new IntPoint(x0, y0));
corners.Add(new IntPoint(x3, y3));
corners.Add(new IntPoint(x1 + 30, y1 + 20));
corners.Add(new IntPoint(x2 + 30, y2 + 0));
AForge.Imaging.Filters.QuadrilateralTransformation filter = new AForge.Imaging.Filters.QuadrilateralTransformation(corners, WidthOfCut, HeightOfCut);
Bitmap newImage = filter.Apply(mainOuterWindow);
AForge.Imaging. библиотека, но она будет резать зелье, как показано ниже
которые нарушают форму круга и делают его эллипсом, что вызывает проблемы для других расчетов.
пожалуйста, дайте мне знать, как обрезать изображение, используя 4 балла.
Или есть какой-то способ исправить наклон изображения, передав угол коррекции?
1 ответ
Если четырехугольник включает в себя угловые стороны, результирующее преобразование на самом деле выглядит довольно хорошо.
Используя это изображение:
Преобразовано этим кодом:
var i = Image.FromFile("pic.png");
List<IntPoint> corners = new List<IntPoint>();
corners.Add(new IntPoint(63, 183));
corners.Add(new IntPoint(863, 151));
corners.Add(new IntPoint(869, 182));
corners.Add(new IntPoint(65, 211));
QuadrilateralTransformation filter = new QuadrilateralTransformation(corners, 869 - 63, 211 - 183);
var i2 = filter.Apply(i);
i2.Save("pic2.png");
Результаты на этом изображении:
Я думаю, что это именно то, что вы ищете.
Уловка заключалась в том, чтобы четырехугольное преобразование использовало угловые стороны, чтобы избежать перекоса. Мои очки выглядят примерно так: