📄 rgb3.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 + -