c - 如何在 GTK 或 Cairo 中将纹理应用到四边形?

标签 c image gtk3

我正在尝试制作一个适合四边形的图像。

#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 个,因此这些数字代表哪一个。很长一段时间以来我一直在试图解决这个问题。我如何使用它们创建一个四边形,并拉伸(stretch)图像以适合内部?另外,如果可能的话,我想避免包含标准头文件和 gtk 以外的头文件。基本上我需要从方形文件中加载图像,然后将其转换以匹配所需的形状。我到底该怎么做?不要以为我是在尝试编辑图像文件,我实际上是在尝试为 block 沙盒游戏渲染 block 面。

我非常感谢您的帮助,但我仍然不太知道如何执行我所描述的操作。我需要知道的是我是否应该使用 GtkDrawingArea

I think I found something for the Mac version of what I am looking for ,但是我如何在 GTK 中做到这一点?

有关更多信息,我正在尝试以 3D 游戏的形式渲染纹理。

在 Metal 教程中,这是首先教授的功能之一。这在 GTK/Cairo 中可行吗?还是我需要放弃我的进度并使用 OpenGL 或 Linux 上的其他东西。

最佳答案

你所说的是任意线性变换。由于 Gtk 是建立在 cairo 图形之上的,因此您非常适合查看其中 ( https://www.cairographics.org/manual/cairo-Transformations.html )。所有线性变换都可以用变换矩阵表示,cairo 将其用作其绘图模型的一部分。然而,它确实说它是一个仿射矩阵,这意味着保留了平行线(即并非所有线性变换都可以表示,并且您的四边形也必须是平行四边形)。

仿射矩阵的使用对于许多图形后端来说很常见。如果您想解决任意扭曲(例如透视)的问题,那么使用 ImageMagick(以 FFMPEG 作为后端)将是一个很好的方法。 OpenGL 也将具有这些功能(例如,在 3D 中,您需要它来进行正交投影。)

为了获得变换矩阵,您需要求解一组联立方程。有助于实现此目的的软件包括 libBLAS、Eigen 和 OpenCV。

关于c - 如何在 GTK 或 Cairo 中将纹理应用到四边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55602612/

相关文章:

c - Termios 和打开文件

c - 静态概念是否等同于按引用传递概念

c - c 编写的服务器显示 bmp 图像的问题

c - 使用 Eclipse 调试 C 中的全局变量

html - 图像未使用 css 从我的系统加载

html - 使横幅图像的某些区域可点击

css - 使用CSS将图标放在按钮的右上角

python - 如何使用自定义 CellRendererText 创建 Gtk Iconview

无法在 GtkTreeView 可编辑行中使用键盘键入(但可以右键单击+粘贴)

c - 尝试再次打开时未出现 Gtk 对话框