gpt4 book ai didi

c++ - 在 GTK+-2.2 中显示 RGB 图像

转载 作者:行者123 更新时间:2023-11-28 03:54:37 25 4
gpt4 key购买 nike

我正在编写一个类,它可以获取我自己的 RGB 图像并使用 GTK+-2.2 将它们显示到窗口。我的 Image 类将图像存储为打包的 24 位 RGB 字节,因此转换应该很简单。我正在使用 gdk_draw_rgb(...) 方法绘制到我的窗口,但根本没有绘制任何东西 - 窗口只是显示为灰色。

我确实使用 Cairo 实现了这一点,不幸的是 Cairo 只能表示 32bpp 格式的图像,而且转换速度太慢。

  class ImageDisplay
{
public:
ImageDisplay();
~ImageDisplay();

void showImage(Image img, std::string label="");

private:
std::thread _gtkThread;

std::map<std::string, GtkWidget*> _windows;
};

// ######################################################################
void gtkThreadMethod()
{
g_thread_init(NULL);
gdk_threads_init();
gdk_threads_enter();

int argc=1;
char **argv = new char*;
argv[0] = new char[8];
sprintf(argv[0], "display");
gtk_init(&argc, &argv);

gdk_rgb_set_verbose(TRUE);

gtk_main();

gdk_threads_leave();
}

// ######################################################################
ImageDisplay::ImageDisplay()
{
// Start gtk in its own thread
_gtkThread = std::thread(gtkThreadMethod);
}

// ######################################################################
ImageDisplay::~ImageDisplay()
{
// Tell GTK that it's time to quit
gdk_threads_enter();
gtk_main_quit();
gdk_threads_leave();

// Wait for the thread to die
_gtkThread.join();
}

// ######################################################################
void ImageDisplay::showImage(Image img, std::string label)
{
gdk_threads_enter();

// Create a new window if one doesn't yet exist
if(_windows.find(label) == _windows.end())
{
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), label.c_str());
gtk_window_set_default_size(GTK_WINDOW(window), img.dims().w(), img.dims().h());
gtk_widget_set_app_paintable(window, TRUE);
gtk_window_set_resizable(GTK_WINDOW(window), true);
GdkGeometry size_hints;
size_hints.min_aspect = 1;
size_hints.max_aspect = 1;
gtk_window_set_geometry_hints(GTK_WINDOW(window), window,
&size_hints, GDK_HINT_ASPECT);
gtk_widget_show_all(window);
_windows[label] = window;
}

GtkWidget* window = _windows[label];

GdkGC *gc = gdk_gc_new(gtk_widget_get_root_window(window));
gdk_draw_rgb_image(
gtk_widget_get_root_window(window),
gc,
0, 0,
img.dims().w(), img.dims().h(),
GDK_RGB_DITHER_NORMAL,
(const unsigned char*)img.const_begin(),
img.dims().w()*3);

gdk_threads_leave();
}

最佳答案

gdk_draw_rgb_image(
gtk_widget_get_root_window(window),

这是你的问题。在 X 术语中(GTK+ 大量借鉴),“根窗口”指的是桌面背景。您需要 gtk_widget_get_window,它会为您提供代表您的窗口的 GdkDrawable

但是...我还没有从上面的行向上走很远,我不确定这段代码的调用者是什么样的,但你通常想要绘制一个“公开事件”处理程序,而不是在调用 gtk_window_new 之后立即。上次我写这种代码时(我承认已经有一段时间了),我会做的是创建一个 GdkPixmap 来绘制,然后将其内容复制到用户可见的GdkWindow 暴露事件。 GtkDrawingArea 小部件在这里很有用,所以我会搜索使用它的示例。

关于c++ - 在 GTK+-2.2 中显示 RGB 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4130518/

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