gtk读取bmp二维数组并显示

时间: 2023-08-04 13:08:16 浏览: 52
下面是一个简单的使用GTK+读取BMP文件并将其显示在窗口中的示例代码: ```c #include <gtk/gtk.h> #include <stdio.h> #include <stdlib.h> typedef struct { int width; int height; unsigned char *data; } BMPImage; BMPImage *loadBMP(const char *filename) { FILE *file; BMPImage *image; file = fopen(filename, "rb"); if (!file) { fprintf(stderr, "Error: failed to open file '%s'\n", filename); return NULL; } image = (BMPImage*) malloc(sizeof(BMPImage)); if (!image) { fprintf(stderr, "Error: failed to allocate memory\n"); fclose(file); return NULL; } // Read BMP header fseek(file, 18, SEEK_SET); fread(&image->width, sizeof(int), 1, file); fread(&image->height, sizeof(int), 1, file); // Allocate memory for image data image->data = (unsigned char*) malloc(image->width * image->height * 3); if (!image->data) { fprintf(stderr, "Error: failed to allocate memory\n"); free(image); fclose(file); return NULL; } // Read image data fseek(file, 54, SEEK_SET); fread(image->data, 3, image->width * image->height, file); fclose(file); return image; } void freeBMP(BMPImage *image) { if (image) { if (image->data) { free(image->data); } free(image); } } void drawBMP(GtkWidget *widget, cairo_t *cr, BMPImage *image) { int x, y; unsigned char *p; for (y = 0; y < image->height; y++) { for (x = 0; x < image->width; x++) { p = image->data + (y * image->width + x) * 3; cairo_set_source_rgb(cr, p[2] / 255.0, p[1] / 255.0, p[0] / 255.0); cairo_rectangle(cr, x, y, 1, 1); cairo_fill(cr); } } } int main(int argc, char **argv) { GtkWidget *window; GtkWidget *drawing_area; BMPImage *image; if (argc < 2) { fprintf(stderr, "Usage: %s <filename.bmp>\n", argv[0]); return 1; } // Load BMP file image = loadBMP(argv[1]); if (!image) { return 1; } // Initialize GTK+ gtk_init(&argc, &argv); // Create window window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "BMP Viewer"); gtk_window_set_default_size(GTK_WINDOW(window), image->width, image->height); // Create drawing area drawing_area = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(window), drawing_area); // Connect signals g_signal_connect(G_OBJECT(drawing_area), "draw", G_CALLBACK(drawBMP), image); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); // Show window gtk_widget_show_all(window); // Start main loop gtk_main(); // Free resources freeBMP(image); return 0; } ``` 代码中的`loadBMP`函数负责读取BMP文件并返回一个包含图像数据的结构体。`drawBMP`函数则负责将图像数据绘制在GTK+的绘图区域中。注意,这里使用了Cairo库来进行绘图。 在`main`函数中,我们首先调用`loadBMP`函数来读取BMP文件,然后创建一个GTK+窗口和一个绘图区域。接着,我们通过`g_signal_connect`函数将`drawBMP`函数与绘图区域的`draw`信号连接起来,这样每当需要绘制窗口时,GTK+就会自动调用`drawBMP`函数。最后,我们通过调用`gtk_main`函数来启动GTK+的主循环,等待用户交互事件发生。 如果你想将该示例代码运行起来,需要在编译时链接GTK+和Cairo库。以gcc为例,你可以使用下面的命令进行编译: ``` gcc -o bmpviewer bmpviewer.c `pkg-config --cflags --libs gtk+-3.0 cairo` ``` 该命令会自动将GTK+和Cairo库链接到你的程序中。

相关推荐

最新推荐

recommend-type

在Windows环境下CodeBlocks+GTK+3.0开发环境配置

GTK+虽然是Linux下的开发工具包,但是因为其跨平台特性,我们可能需要在Windows 环境下进行程序开发。所以如何在Windows下配置GTK+的开发环境...本文在下文基础上增加了GTK+3.0模板修改功能并更新了部分下载链接及截图 ...
recommend-type

GTK+2.0教程(中文版)

该书详细介绍了GTK+开发的方法。GTK (GIMP Toolkit) 是一套用于创建图形用户界面的工具包。
recommend-type

嵌入式gtk+体积裁剪

我们使用了GTK+的新版本 2.10.9,编译出来的大小为20M,而且不是debug版本的,体积很是庞大,在嵌入式环境中尤为突出,因此需要进行裁剪
recommend-type

gtk布局管理,实用,详细!

gtk布局管理,实用,详细! gtk布局管理,实用,详细! gtk布局管理,实用,详细! gtk布局管理,实用,详细! gtk布局管理,实用,详细!
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依