gpt4 book ai didi

c++ - 尝试将 GTK+ 窗口渲染为图像

转载 作者:行者123 更新时间:2023-11-30 02:49:26 25 4
gpt4 key购买 nike

GTK 使用 cairo 进行绘图。所以我正在尝试创建一个写入图像(svg、png、...)而不是 X11 的 hello world 应用程序。我面临两个问题:- 图片为空- 在没有运行 X11 的情况下启动时(这是实际目标)我收到错误“** (a.out:9021): WARNING **: Could not open X display”

代码是草稿!

#include <string>
#include <iostream>
#include <thread>
#include <chrono>
#include <cmath>

#include <cairo.h>
#include <cairommconfig.h>
#include <cairomm/context.h>
#include <cairomm/surface.h>
#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>

int main(int argc, char *argv[])
{

gtk_init(&argc, &argv);
GtkWidget *window;
GtkWidget *button;
// GtkWidget *main_window = gtk_initialize();

window = gtk_offscreen_window_new();

button = gtk_button_new_with_label ("Hello World");
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (window);
GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(window));
std::cout << "gdk window: " << gdk_window << std::endl;
cairo_surface_t * surfp = gdk_offscreen_window_get_surface(gdk_window);
std::cout << "Created Window will now draw to png" << std::endl;

std::string filename = "image.svg";
double width = 600;
double height = 400;

Cairo::SvgSurface srfobj(surfp);

Cairo::RefPtr<Cairo::SvgSurface> refptr(&srfobj);

Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create(refptr);

cr->save(); // save the state of the context
cr->show_page();

std::cout << "Wrote SVG file \"" << filename << "\"" << std::endl;
std::chrono::milliseconds dura( 200 );
std::this_thread::sleep_for(dura);

return 0;
}
  • 为什么这段代码不起作用?
  • 我可以在不运行 X11 的情况下运行 gtk 应用程序,还是应该忽略警告?

最佳答案

这是我基于您的示例代码的解决方案 - 请记住,这是一个肮脏的解决方案,可能无法使用较新版本的 GTK3。它可以保存窗口的用户界面(仅使用一个按钮进行测试),但仍然需要(某处)正在运行的 X 服务器。它还会忽略/不使用您对图片大小的设置 - 您必须自己调整大小。我不知道是否(以及如何)也可以剪切此字符串 (X-Server//X-Framebuffer)(似乎不再真正支持 DirectFB),但是...

玩得开心!

// Default
#include <string>
#include <iostream>
#include <thread>
#include <chrono>

// cairo / cairomm / gtk
#include <cairo.h>
#include <cairomm/context.h> //libcairomm-1.0-dev
#include <gtk/gtk.h>

int main(int argc, char *argv[]) {
// Init
gtk_init(&argc, &argv);

// Create window with a button
GtkWidget *window;
GtkWidget *button;

window = gtk_offscreen_window_new();
button = gtk_button_new_with_label("Hello World");
gtk_container_add(GTK_CONTAINER(window), button);
gtk_widget_show_all(window);

// Make a gdk window out of it, prepare cairo and draw it to it
GdkWindow* gdk_window = gtk_widget_get_window(GTK_WIDGET(window));
cairo_surface_t* surfp = gdk_offscreen_window_get_surface(gdk_window);
cairo_t* context = cairo_create(surfp);
gtk_widget_draw(GTK_WIDGET(window), context);

// Yay - begin the dump!
Cairo::SvgSurface srfobj(surfp);
std::string filename = "image.png";
srfobj.write_to_png(filename);
std::cout << "Done." << std::endl;

// Aaand a little sleep...
std::chrono::milliseconds dura(1000);
std::this_thread::sleep_for(dura);

return 0;
}

关于c++ - 尝试将 GTK+ 窗口渲染为图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21182853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com