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

#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

如果有人愿意分享,请先谢谢!

最佳答案

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

仿射矩阵的使用在许多图形后端都很常见。如果您想解决任意失真(例如透视图)的问题,那么使用ImageMagick(具有FFMPEG作为后端)将是一个不错的方法。 OpenGL也将具有这些功能(例如,在进行3D投影时,需要使用此功能进行正投影)

为了获得转换矩阵,您将需要求解一组联立方程。对此有帮助的软件包括libBLAS,Eigen和OpenCV。

关于c - 我需要一些帮助来拉伸(stretch)图像以适合四边形,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55602612/

10-13 21:50