我希望在使用gtkmm编写的Gui中显示一个cv::Mat。所以我进行了一次测试。
我有一个小部件
第一种方法很有效。 然而,第二种方法效果不佳,我在屏幕上看到了一张损坏的图片,如图所示。 如果我将 has_alpha 参数设置为 true,结果也很奇怪(见下图)。 使用 Gtk::DrawingArea 进行了类似的测试。使用不同的 IDE(但都是在 Linux 下使用 g++ 编译器)。所有的结果都相同。
更新:
我测试了很多图片。有时候图片会损坏,有时程序会崩溃并显示:
“程序意外终止。”
我有一个小部件
Gtk::Image image
,我想用以下两种方法设置图像:// first method, display from file
void displayImage1()
{
Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create_from_file("gtk.png");
image.set(pixbuf);
}
// second method, display from cv::Mat
void displayImage2()
{
cv::Mat outImage = cv::imread("gtk.png");
cv::cvtColor(outImage, outImage, CV_BGR2RGB);
Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create_from_data(outImage.data, Gdk::COLORSPACE_RGB,false, 8, outImage.cols, outImage.rows, outImage.step);
image.set(pixbuf);
}
第一种方法很有效。 然而,第二种方法效果不佳,我在屏幕上看到了一张损坏的图片,如图所示。 如果我将 has_alpha 参数设置为 true,结果也很奇怪(见下图)。 使用 Gtk::DrawingArea 进行了类似的测试。使用不同的 IDE(但都是在 Linux 下使用 g++ 编译器)。所有的结果都相同。
更新:
我测试了很多图片。有时候图片会损坏,有时程序会崩溃并显示:
“程序意外终止。”
outImage
超出范围而被释放。您需要一种实际复制gtk图像内部数据的方法。 - Miki