我正在尝试制作适合四边形的图像。
#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/