Как мне применить текстуру к квадрату в GTK или Cairo?

#c #image #gtk3

#c #изображение #gtk3

Вопрос:

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

 #include <gtk/gtk.h>

int main(int argc, char *argv[]) {
    gtk_init(amp;argc, amp;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, если это возможно. В основном мне нужно загрузить изображение из файла, которое имеет квадратную форму, а затем преобразовать его в соответствии с желаемой формой. Как именно мне это сделать? Не думайте, что я пытаюсь редактировать файлы изображений, на самом деле я пытаюсь отобразить грани блоков для игры в блочной песочнице.

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

Я думаю, что нашел кое-что для Mac-версии того, что я ищу, но как я могу это сделать в GTK?

Для получения дополнительной информации я пытаюсь отобразить текстуры в форме 3D-игры.

В учебных пособиях по металлу это одна из первых функций, которым обучают. Возможно ли это в GTK / Cairo, или мне нужно отказаться от своего прогресса и использовать OpenGL или что-то еще для Linux.

Комментарии:

1. Есть ли какие-либо ограничения в форме вашего четырехугольника? Вы говорите о масштабировании, повороте или искажении изображения или о любой их комбинации?

2. @Gerhardh Если подумать, нет необходимости в масштабировании или повороте. Они x1 y1 x2 y2 x3 y3 x4 y4 смогут построить любой четырехугольник. Они соответствуют вершинам, у меня нет никаких ограничений, и все, что мне нужно, это использовать их. узнайте, как сделать четырехугольник, затем расположите вершины, используя эти восемь чисел, а затем поместите изображение внутрь и растяните его, чтобы оно соответствовало

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

4. Легко сделать в ImageMagick. См . imagemagick.org/Usage/distorts/#perspective

5. @Gerhardh Да, ваше предположение верно. Итак, как именно мне это сделать?

Ответ №1:

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

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

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

Комментарии:

1. Нужно ли мне это делать: или нет? #include <cairo.h>

2. Если вы решите использовать cairo, обязательно. Убедитесь, что у вас установлены заголовки разработки и указан путь к ним во время компиляции.

3. Должен ли я использовать cairo или можно использовать только gtk3

4. Как именно мне создать матрицу преобразования, используя восемь чисел?

5. Gtk по умолчанию использует cairo. Gtk3 также может использовать wayland в качестве серверной части, которая построена на OpenGL