Мне нужно немного помочь растянуть изображения, чтобы соответствовать четырехугольнику - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь сделать изображение для четырехугольника.

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);
    GtkWidget (*Image) = gtk_image_new_from_file("image.png");
    GtkWidget (*Window) = gtk_window_new(0);
    gtk_image_set_pixel_size(GTK_IMAGE(Image), 200);
    gtk_container_add(GTK_CONTAINER(Window), Image);
    gtk_widget_show_all(Window);
    gtk_main();
    return 0;
}

Предположим, у меня 8 переменных. Каждое соответствует вершинам четырехугольника. x1 y1 x2 y2 x3 y3 x4 y4 Эти восемь чисел соответствуют четырем точкам в окне / области рисования, которые можно использовать для построения четырехугольника. Эти числа представляют точки, которые находятся на x пикселей слева и y наверху окна, и, поскольку существует 4, цифры представляют какую из них. Я пытался понять это в течение длительного времени. Как я могу использовать их, чтобы создать четырехугольник и растянуть изображение, чтобы оно поместилось внутри? Кроме того, я хочу избежать включения заголовочных файлов, отличных от стандартных, и gtk, если это возможно. В основном мне нужно загрузить изображение из файла, который является квадратным, а затем преобразовать его, чтобы соответствовать желаемой форме. Как именно я это делаю?

Я ценю помощь, но я все еще не знаю, как делать то, что я описываю. Что-то, что мне нужно знать, это использовать GtkDrawingArea или нет?

Спасибо, если кто-нибудь захочет поделиться!

1 Ответ

1 голос
/ 11 апреля 2019

То, о чем вы говорите, - это произвольное линейное преобразование.Поскольку Gtk построен поверх графики Каира, вам было бы неплохо взглянуть на нее (https://www.cairographics.org/manual/cairo-Transformations.html). Все линейные преобразования могут быть представлены матрицей преобразования, которую Каир использует как часть своей модели чертежа. Однако в нем говорится, чтоэто аффинная матрица, которая означает, что параллельные линии сохраняются (т.е. не все линейные преобразования могут быть представлены, и ваш четырехугольник также должен быть параллелограммом).

Использование аффинных матриц является общим для многих графических бэкэндовЕсли вы хотите обойти это для произвольных искажений (например, в перспективе), использование ImageMagick (имеет FFMPEG в качестве бэкэнда) было бы хорошим подходом. OpenGL также будет иметь эти возможности (будучи 3D, вам это нужно для выполнения ортографических проекций, например.)

Чтобы получить матрицу преобразования, вам необходимо решить ряд уравнений одновременно. Программное обеспечение, которое поможет с этим, включает libBLAS, Eigen и OpenCV.

...