基于gtk的imshow:用gtk读取并显示图像
gtk实现imshow,最naive的做法是用gtk的组件去读取图像,然后show出来;后续再考虑用GTK显示用别的方式例如stb image读取的图像。先前基于GDI实现imshow时也是这一思路,先能show出来给自己一点信心。
官方代码
gtk官方文档提供了这个例子,并且show出来的图像和原图大小一致。
#include <gtk/gtk.h>
static void activate (GtkApplication *app, gpointer user_data)
{
    GtkWidget *window;
    GtkWidget *image;
    /*Create a window with a title and a default size*/
    window = gtk_application_window_new (app);
    gtk_window_set_title (GTK_WINDOW (window), "Welcome to GNOME");
    //gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
    const char* im_pth = "/home/zz/work/libfc/imgs/Lena.png";
    image = gtk_image_new_from_file (im_pth);
    gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (image));
    gtk_widget_show_all (GTK_WIDGET (window));
}
int main (int argc, char **argv)
{
    GtkApplication *app;
    int status;
    app = gtk_application_new ("org.gtk.example",G_APPLICATION_FLAGS_NONE);
    g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    status = g_application_run (G_APPLICATION (app), argc, argv);
    g_object_unref (app);
    return status;
}
效果:

简单封装
从imshow的用户来讲,ta只需要传入图片路径、图片标题,就应该得到显示结果。因此可以把上述代码进行封装。使用了全局变量my_window,这是因为回调函数无法传入额外的参数,并且后续要给窗口绑定更多的参数。
#include <gtk/gtk.h>
#include <stdlib.h>
typedef struct MyWindow {
    const char* im_pth;
    const char* title;
} MyWindow;
MyWindow my_window;
static void activate (GtkApplication *app, gpointer user_data)
{
    GtkWidget *window;
    GtkWidget *image;
    /*Create a window with a title and a default size*/
    window = gtk_application_window_new (app);
    gtk_window_set_title (GTK_WINDOW (window), my_window.title);
    //gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
    image = gtk_image_new_from_file (my_window.im_pth);
    gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (image));
    gtk_widget_show_all (GTK_WIDGET (window));
}
void show_image_gtk_temp()
{
    GtkApplication *app;
    int status;
    app = gtk_application_new ("org.gtk.example",G_APPLICATION_FLAGS_NONE);
    g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    status = g_application_run (G_APPLICATION (app), 0, NULL);
    g_object_unref (app);
}
void gtk_show_image_v1(const char* im_pth, const char* title) {
    my_window.im_pth = im_pth;
    my_window.title = title;
    show_image_gtk_temp();
}
int main() {
    const char* im_pth = "/home/zz/work/libfc/imgs/fruits.jpg";
    const char* title = "fruit";
    gtk_show_image_v1(im_pth, title);
    return 0;
}

参考
https://developer.gnome.org/gnome-devel-demos/stable/image.c.html.en
基于gtk的imshow:用gtk读取并显示图像的更多相关文章
- 基于gtk的imshow:用stb_image读取图像并用gtk显示
		
在前面一篇,已经能够基于gtk读取图像并显示.更前面的一篇:基于GDI的imshow:使用stb_image读取图像并修正绘制,通过stb_image读取图像并通过GDI显示图像,实现了一个imsho ...
 - 最简单的基于FFmpeg的AVDevice例子(读取摄像头)
		
=====================================================最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDev ...
 - [转载] 最简单的基于FFmpeg的AVDevice例子(读取摄像头)
		
=====================================================最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDev ...
 - 最简单的基于FFmpeg的AVDevice例子(读取摄像头)【转】
		
转自:http://blog.csdn.net/leixiaohua1020/article/details/39702113 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[- ...
 - GTK+重拾--07 GTK+中的事件
		
(一):写在前面 在这一个小节中,我们主要是学习GTK+2.0中最重要的部分.就是信号和事件.GTK+函数工具库是基于"事件"系统的.全部的GUI应用都是基于"事件&qu ...
 - 基于最简单的FFmpeg采样读取内存读写:存储转
		
===================================================== 基于最简单的FFmpeg样品系列读写内存列表: 最简单的基于FFmpeg的内存读写的样例:内 ...
 - 基于最简单的FFmpeg采样读取内存读写:内存玩家
		
===================================================== 基于最简单的FFmpeg样品系列读写内存列表: 最简单的基于FFmpeg的内存读写的样例:内 ...
 - 【Gtk】feorda下gtk安装详解
		
feorda下gtk安装详解 1.yum在线安装gtk 1)pkg-config -version查看pkg-config的版本(本机测试是0.25) 2)安装必要组建:(在root权限下) ...
 - GTK+重拾--09 GTK+中的组件(一)
		
(一):写在前面 在这篇文章中主要介绍了GTK+程序中的各种构件,这是解说构件的第一个部分,另外一部分将在下一个小节中讲到. 构件是建立一个GUI程序的基础.在GTK+的长期发展过程中.一些特定的构件 ...
 
随机推荐
- iOS开发需要哪些设备
			
ios开发硬件配置环境 工具:使用到 Xcode 和 iOS SDK(Apple 提供的开发工具). 硬件配置: 首先有一台Mac电脑,然后有一个iDevice——iPhone.iPad.iPod T ...
 - 【链接】在线压缩JS文件
			
在线压缩JS文件: http://yui.2clics.net/ https://refresh-sf.com/
 - Swift编码总结9
			
1.Swift限制textField输入位数为10位: func textField(_ textField: UITextField, shouldChangeCharactersIn range: ...
 - K8S使用入门-创建第一个容器
			
前面两个教程我们已经使用kubekit将K8S搭建起来了.但是,没有将实际使用中需要在K8S上部署我们的容器创建起来的教程,都是耍流氓.所以,经过几番折腾,我回来给自己洗白了.之前一直卡在创建第一个容 ...
 - 最常见的Java面试题及答案汇总(二)
			
上一篇:最常见的Java面试题及答案汇总(一) 容器 18. java 容器都有哪些? 常用容器的图录: 19. Collection 和 Collections 有什么区别? java.util.C ...
 - django:删除表后怎么重新数据迁移生成表
			
1.将对应app下的migrations文件夹下面的除了__init__.py文件外全部删除 2.delete from django_migrations where app='app_name' ...
 - charles 4.2.1 Ubuntu破解版安装
			
charles 4.2.1 Ubuntu破解版安装 下载 charles-proxy-4.2.1_amd64.tar.gz 破解版 charles.jar 破解包 解压 sudo tar -zxvf ...
 - 字符串A转换到字符串B,只能一次一次转换,每次转换只能把字符串A中的一个字符全部转换成另一个字符,是否能够转换成功
			
public class DemoTest { public static void main(String[] args) { System.)); } /** * 有一个字符串A 有一个字符串B ...
 - 23 SVN---版本控制系统
			
1.SVN介绍 SVN是Subversion的简称,是一个自由开源的版本控制系统. Subversion将文件存放在中心版本库里,这个版本库很像一个普通的文件服务器,不同的是,它可以记录每一次文件和目 ...
 - 218. The Skyline Problem (LeetCode)
			
天际线问题,参考自: 百草园 天际线为当前线段的最高高度,所以用最大堆处理,当遍历到线段右端点时需要删除该线段的高度,priority_queue不提供删除的操作,要用unordered_map来标记 ...