⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rgb3.c

📁 在linux中打开bmp图片: 在命令行智能光运行得出执行文件后
💻 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 + -