📄 gtkbmp_open.c
字号:
#include <gtk/gtk.h>#include <stdlib.h>#include <stdio.h>typedef struct{gint IMAGE_WIDTH;gint IMAGE_HEIGHT;guchar *IMAGE_DATA;}bmpinfo;gboolean on_darea_expose (GtkWidget *widget, GdkEventExpose *event, gpointer user_data){ bmpinfo *bmpfile; bmpfile=user_data; gdk_draw_rgb_image (widget->window, widget->style->fg_gc[GTK_STATE_NORMAL], 0,0,bmpfile->IMAGE_WIDTH, bmpfile->IMAGE_HEIGHT, GDK_RGB_DITHER_MAX,bmpfile->IMAGE_DATA ,bmpfile->IMAGE_WIDTH * 3); return TRUE;}bmpinfo* loadbmp(char *filename){ FILE *infile; bmpinfo *bmpfile; unsigned char Head[54]; unsigned long i,j,k,p; unsigned char bt0,bt1,bt2; guchar *rgbbuf,*rgbbuf2; unsigned long datasize; unsigned char stuff[4]; infile=fopen(filename,"rb+"); if(infile==NULL) { g_print("Open 24 bit bitmap file failed!"); return NULL; } bmpfile=(bmpinfo *)malloc(sizeof(bmpinfo)); fread(Head,54,1,infile); bmpfile->IMAGE_WIDTH=*(Head+18)+(*(Head+19))*256; bmpfile->IMAGE_HEIGHT=*(Head+22)+(*(Head+23))*256; datasize=bmpfile->IMAGE_WIDTH*bmpfile->IMAGE_HEIGHT*3; p=(bmpfile->IMAGE_WIDTH*3)%4; rgbbuf2=(guchar *)malloc(datasize); rgbbuf=(guchar *)malloc(datasize); for(i=0;i<bmpfile->IMAGE_HEIGHT;i++) { for(j=0;j<bmpfile->IMAGE_WIDTH;j++) { fread((unsigned char *)&bt0,1,1,infile); fread((unsigned char *)&bt1,1,1,infile); fread((unsigned char *)&bt2,1,1,infile); *(rgbbuf2+i*bmpfile->IMAGE_WIDTH*3+j*3+0)= bt2; *(rgbbuf2+i*bmpfile->IMAGE_WIDTH*3+j*3+1)= bt1; *(rgbbuf2+i*bmpfile->IMAGE_WIDTH*3+j*3+2)= bt0; } if(p!=0) fread(stuff,1,(4-p),infile); } for(i=0,k=bmpfile->IMAGE_HEIGHT-1;i<bmpfile->IMAGE_HEIGHT;i++,k--) { for(j=0;j<bmpfile->IMAGE_WIDTH;j++) { *(rgbbuf+i*bmpfile->IMAGE_WIDTH*3+j*3+0)= *(rgbbuf2+k*bmpfile->IMAGE_WIDTH*3+j*3+0); *(rgbbuf+i*bmpfile->IMAGE_WIDTH*3+j*3+1)= *(rgbbuf2+k*bmpfile->IMAGE_WIDTH*3+j*3+1); *(rgbbuf+i*bmpfile->IMAGE_WIDTH*3+j*3+2)= *(rgbbuf2+k*bmpfile->IMAGE_WIDTH*3+j*3+2); } } bmpfile->IMAGE_DATA=rgbbuf; free(rgbbuf2); fclose(infile); return bmpfile;}int main (int argc, char *argv[]){ GtkWidget *window, *darea; bmpinfo *bmpfile; gtk_init (&argc, &argv); if(argc!=2){ printf("Usage:%s bmpimage\n",argv[0]); return 1; } /* Set up the RGB buffer. */ bmpfile=loadbmp(argv[1]); if(bmpfile==NULL) { g_print("load image failed!\n"); return 1; } window = gtk_window_new (GTK_WINDOW_TOPLEVEL); darea = gtk_drawing_area_new (); gtk_widget_set_size_request (darea, bmpfile->IMAGE_WIDTH,bmpfile->IMAGE_HEIGHT); gtk_container_add (GTK_CONTAINER (window), darea); gtk_signal_connect (GTK_OBJECT (darea), "expose-event", GTK_SIGNAL_FUNC (on_darea_expose),bmpfile); gtk_widget_show_all (window); g_signal_connect(GTK_OBJECT(window),"delete_event", G_CALLBACK(gtk_main_quit),NULL); gtk_main (); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -