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

📄 main_bmp.c

📁 在bmp.h中定制其功能 1:bmp图像格式之间的转换
💻 C
字号:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <getopt.h>
#include "bmp.h"

void init_header(BITMAPFILEHEADER * bmp_header)
{
	#ifdef INIT_24
		bmp_header->bfType		=	0x4d42 ;		
		bmp_header->bfSize		=	0x38436;
		bmp_header->bfReserved1	=	0x0    ;
		bmp_header->bfReserved2	=	0x0    ;
		bmp_header->bfOffBits	=	0x36   ;
	#endif
	
	#ifdef INIT_16
		bmp_header->bfType		=	0x4d42 ;		
		bmp_header->bfSize		=	0x25846;//0x25836;
		bmp_header->bfReserved1	=	0x0    ;
		bmp_header->bfReserved2	=	0x0    ;
		bmp_header->bfOffBits	=	0x46   ;
	#endif
	//printf("bmp_header->bfType:%x\n",bmp_header->bfType);
	
}

void init_info(BITMAPINFOHEADER * bmp_info)
{
	#ifdef INIT_24
		bmp_info->biSize			=	0x28   ;
		bmp_info->biWidth			=	0x140  ;
		bmp_info->biHeight			=	0xf0   ;
		bmp_info->biPlanes			=	0x1    ;
		bmp_info->biBitCount		=	0x18   ;
		bmp_info->biCompression		=   0x0    ;
		bmp_info->biSizeImage		=   0x38400;
		bmp_info->biXPelsPerMeter	=   0xec4  ;
		bmp_info->biYPelsPerMeter	=   0xec4  ;
		bmp_info->biClrUsed			=   0x0    ;
		bmp_info->biClrImportant	=	0x0    ;
	#endif
	
	
	#ifdef INIT_16
		//bmp_info->biSize			=	0x28 ;
		//bmp_info->biWidth			=	0x140;
		//bmp_info->biHeight			=	0xf0 ;
		//bmp_info->biPlanes			=	0x1  ;
		//bmp_info->biBitCount		=	0x10 ;
		//bmp_info->biCompression		=   0x0  ;
		//bmp_info->biSizeImage		=   0x0  ;
		//bmp_info->biXPelsPerMeter	=   0x0  ;
		//bmp_info->biYPelsPerMeter	=   0x0  ;
		//bmp_info->biClrUsed			=   0x0  ;
		//bmp_info->biClrImportant	=	0x0  ;
		
		bmp_info->biSize			=	0x28 ;
		bmp_info->biWidth			=	0x140;
		bmp_info->biHeight			=	0xf0 ;
		bmp_info->biPlanes			=	0x1  ;
		bmp_info->biBitCount		=	0x10 ;
		bmp_info->biCompression		=   0x3  ;
		bmp_info->biSizeImage		=   0x38400  ;
		bmp_info->biXPelsPerMeter	=   0xec4  ;
		bmp_info->biYPelsPerMeter	=   0xec4  ;
		bmp_info->biClrUsed			=   0x0  ;
		bmp_info->biClrImportant	=	0x0  ;
		
	#endif
	
}


void w_t_f_d(u32 u32_n, FILE* file_b)
{
	int i=0;
	//printf("u32_n:%x\n",u32_n);
	for(i=0;i<4;i++)
		fputc((u32_n>>(8*i))&0xff,file_b);
}

void w_t_f_s(u16 u16_n, FILE* file_b)
{
	int i=0;
	//printf("u16_n:%x\n",u16_n);
	for(i=0;i<2;i++)
		fputc((u16_n>>(8*i))&0xff,file_b);
}


int main(int argc, char **argv)
{
	FILE *infile, *outfile;
	int c,a,d;
	int this_option_optind = optind ? optind : 1;
    int option_index = 0;
    unsigned char cin;
    unsigned char cout;
    unsigned char table_16bpp[]={0x00,0xF8 ,0x00,0x00 ,0xE0,0x07 ,0x00,0x00 ,0x1F,0x00 ,0x00,0x00 ,0x00,0x00 ,0x00,0x00};
    printf("sizeof(table_16bpp):%d\n",sizeof(table_16bpp));
    
    char in_name[1024];
    char out_name[1024];    
    unsigned char cin_list[1024];
    u32		temp;  
    u32		bmp_size[1024][1024];
	int i,j;
	
	/*BITMAPFILEHEADER_*/
	BITMAPFILEHEADER * bmp_header	=	(BITMAPFILEHEADER *)malloc( sizeof(BITMAPFILEHEADER));
	BITMAPINFOHEADER * bmp_info		=	(BITMAPINFOHEADER *)malloc( sizeof(BITMAPINFOHEADER));
	
	//printf("sizeof(BITMAPFILEHEADER):%d\n",sizeof(BITMAPFILEHEADER));
	init_header(bmp_header);
	//printf("bmp_header->bfType:%x\n",bmp_header->bfType);
	
	init_info(bmp_info);
	opterr=0;
	while(1){
		c=getopt(argc,argv,"i:o:h");
		if (c == -1)
		  break;
		
		switch (c){
		case 'i':
		  strcpy(in_name,optarg);
			//printf("%s\n",c_name);
		  break;
		case 'o':
		  strcpy(out_name,optarg);
			//printf("%s\n",f_name);
		  break;
		default:
		  printf("Illegal option.\n");
		  printf("default for help.\n");
		  return -1;
		};
	};


	if(!(infile=fopen(in_name,"rb"))){
	  perror(in_name);
	  printf("input file is not opened");
	  return -1;
	};
	
	#ifdef DEGUGE
		if(!(outfile=fopen(out_name,"w"))){
	#else
		if(!(outfile=fopen(out_name,"wb"))){
	#endif	
	  perror(out_name);
	  printf("output file is not opened");
	  return -1;
	};
	
	for(i=0;i<BITMAPFILEHEADER_SIZE;i++)
	{
		cin	=	fgetc(infile);
		
//			#ifdef CONVERT_TO_16BPP
//				if(i==2)
//					fputc(0x36,outfile);
//				else if(i==3)
//					fputc(0x58,outfile);
//				else if(i==4)
//					fputc(0x02,outfile);
//				else if(i==5)
//					fputc(0x00,outfile);
//				else 
//					fputc(cin,outfile);
//			#endif
//			
//			#ifdef OLD_IMAGE 
//			    fputc(cin,outfile);
//			#endif
//
//			#ifdef REVERT_IMAGE 
//			    fputc(cin,outfile);
//			#endif		
//			
//			#ifdef ROTATE_IMAGE_180 
//			    fputc(cin,outfile);
//			#endif	
				
		//printf("%x\n",cin);
		cin_list[i]	=	cin;
	}
	
	//printf("bfType:%x\n",cin_list);
	/*****************************/
	/*BITMAPFILEHEADER genaration*/
//	j=0;
//	for(i=0;i<sizeof(bmp_header->bfType);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_header->bfType+=(temp)<<(8*i);
//	}
//
//	for(i=0;i<sizeof(bmp_header->bfSize);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_header->bfSize+=(temp)<<(8*i);
//	}
//
//	for(i=0;i<sizeof(bmp_header->bfOffBits);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_header->bfOffBits+=(temp)<<(8*i);
//	}
			
//	temp=0;
//	temp=(cin_list[0]);
//	bmp_header->bfType=(temp<<8)+cin_list[1];
	
//	for(i=0;i<4;i++)
//	{
//		temp=0;
//		temp=(cin_list[2+i]);
//		bmp_header->bfSize+=(temp)<<(8*i);
//	}
	
//	for(i=0;i<4;i++)
//	{
//		temp=0;
//		temp=(cin_list[10+i]);
//		bmp_header->bfOffBits+=(temp)<<(8*i);
//	}
	
	//printf("bfType:%c%c\n",bmp_header->bfType>>8,bmp_header->bfType);
	//printf("bfSize:%x\n",bmp_header->bfSize);
	//printf("bfOffBits:%d\n",bmp_header->bfOffBits);
	/*BITMAPFILEHEADER genaration*/
	/*****************************/
	
	
	////////////////////////////
	/*get the BITMAPINFOHEADER*/
	
	for(i=0;i<(bmp_header->bfOffBits-BITMAPFILEHEADER_SIZE);i++)
	{
		cin	=	fgetc(infile);
		

//			#ifdef CONVERT_TO_16BPP
//				if(i==14)
//					fputc(0x10,outfile);
//				else
//					fputc(cin,outfile);
//			#endif
//
//			#ifdef OLD_IMAGE 
//			    fputc(cin,outfile);
//			#endif
//
//			#ifdef REVERT_IMAGE 
//			    fputc(cin,outfile);
//			#endif		
//			
//			#ifdef ROTATE_IMAGE_180 
//			    fputc(cin,outfile);
//			#endif		
		//printf("%x\n",cin);
		cin_list[i]	=	cin;
	}
//	j=0;
//	for(i=0;i<sizeof(bmp_info->biSize);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_info->biSize+=(temp)<<(8*i);
//	}
//	for(i=0;i<sizeof(bmp_info->biWidth);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_info->biWidth+=(temp)<<(8*i);
//	}
//	for(i=0;i<sizeof(bmp_info->biHeight);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_info->biHeight+=(temp)<<(8*i);
//	}
//	for(i=0;i<sizeof(bmp_info->biPlanes);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_info->biPlanes+=(temp)<<(8*i);
//	}
//	for(i=0;i<sizeof(bmp_info->biBitCount);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_info->biBitCount+=(temp)<<(8*i);
//	}
//	for(i=0;i<sizeof(bmp_info->biCompression);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_info->biCompression+=(temp)<<(8*i);
//	}
//	for(i=0;i<sizeof(bmp_info->biSizeImage);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_info->biSizeImage+=(temp)<<(8*i);
//	}
//	for(i=0;i<sizeof(bmp_info->biXPelsPerMeter);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_info->biXPelsPerMeter+=(temp)<<(8*i);
//	}
//	for(i=0;i<sizeof(bmp_info->biYPelsPerMeter);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_info->biYPelsPerMeter+=(temp)<<(8*i);
//	}
//	for(i=0;i<sizeof(bmp_info->biClrUsed);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_info->biClrUsed+=(temp)<<(8*i);
//	}
//	for(i=0;i<sizeof(bmp_info->biClrImportant);i++)
//	{
//		temp=0;
//		temp=(cin_list[j]);
//		j++;
//		bmp_info->biClrImportant+=(temp)<<(8*i);
//	}
	////////////////////////////
	
	////////////////////////////
	/*get the bmp data*/
	for(i=0;i<240;i++)
	{
		for(j=0;j<320;j++)
		{
			cin=fgetc(infile);
			bmp_size[i][j]=cin;
			cin=fgetc(infile);
			bmp_size[i][j]=(bmp_size[i][j]<<8)+cin;
			cin=fgetc(infile);
			bmp_size[i][j]=(bmp_size[i][j]<<8)+cin;
		}
	}
	////////////////////
//	printf("bmp_size[239][0]:%x\nbmp_size[239][1]:%x\n",bmp_size[239][0],bmp_size[239][1]);
	
	/*old image*/
	#ifdef OLD_IMAGE
	
	w_t_f_s(bmp_header->bfType		,outfile);
	w_t_f_d(bmp_header->bfSize		,outfile);
	w_t_f_s(bmp_header->bfReserved1	,outfile);
	w_t_f_s(bmp_header->bfReserved2	,outfile);
	w_t_f_d(bmp_header->bfOffBits	,outfile);
	
	
	w_t_f_d(bmp_info->biSize			,outfile);
	w_t_f_d(bmp_info->biWidth			,outfile);
	w_t_f_d(bmp_info->biHeight		    ,outfile);
	w_t_f_s(bmp_info->biPlanes		    ,outfile);
	w_t_f_s(bmp_info->biBitCount		,outfile);
	w_t_f_d(bmp_info->biCompression	    ,outfile);
	w_t_f_d(bmp_info->biSizeImage		,outfile);
	w_t_f_d(bmp_info->biXPelsPerMeter	,outfile);
	w_t_f_d(bmp_info->biYPelsPerMeter	,outfile);
	w_t_f_d(bmp_info->biClrUsed		    ,outfile);
	w_t_f_d(bmp_info->biClrImportant	,outfile);
	
	
	for(i=0;i<240;i++)
	{
		for(j=0;j<320;j++)
		{
			fputc(((bmp_size[i][j]>>16)&0xff),outfile);
			fputc(((bmp_size[i][j]>>8)&0xff),outfile);
			fputc(((bmp_size[i][j])&0xff),outfile);
		}
	}
	#endif
		
	/*revert image*/
	#ifdef REVERT_IMAGE
	
	w_t_f_s(bmp_header->bfType		,outfile);
	w_t_f_d(bmp_header->bfSize		,outfile);
	w_t_f_s(bmp_header->bfReserved1	,outfile);
	w_t_f_s(bmp_header->bfReserved2	,outfile);
	w_t_f_d(bmp_header->bfOffBits	,outfile);
	
	
	w_t_f_d(bmp_info->biSize			,outfile);
	w_t_f_d(bmp_info->biWidth			,outfile);
	w_t_f_d(bmp_info->biHeight		    ,outfile);
	w_t_f_s(bmp_info->biPlanes		    ,outfile);
	w_t_f_s(bmp_info->biBitCount		,outfile);
	w_t_f_d(bmp_info->biCompression	    ,outfile);
	w_t_f_d(bmp_info->biSizeImage		,outfile);
	w_t_f_d(bmp_info->biXPelsPerMeter	,outfile);
	w_t_f_d(bmp_info->biYPelsPerMeter	,outfile);
	w_t_f_d(bmp_info->biClrUsed		    ,outfile);
	w_t_f_d(bmp_info->biClrImportant	,outfile);
	
	for(i=0;i<240;i++)
	{
		for(j=0;j<320;j++)
		{
			fputc(255-((bmp_size[i][j]>>16)&0xff),outfile);
			fputc(255-((bmp_size[i][j]>>8)&0xff),outfile);
			fputc(255-((bmp_size[i][j])&0xff),outfile);
		}
	}
	#endif
	
	
	/*for ac3310*/
	#ifdef AS3310C
		for(i=239;i>=0;i--)
		{
			for(j=0;j<320;j++)
			{
				temp=((bmp_size[i][j]>>8)&0xf800)|((bmp_size[i][j]>>5)&0x07e0)|((bmp_size[i][j]>>3)&0x001f);
				fputc(temp&0xff,outfile);
				fputc((temp>>8)&0xff,outfile);
			}
		}
	#endif
	
	/*for convert to 16bpp*/
	#ifdef CONVERT_TO_16BPP
	
	w_t_f_s(bmp_header->bfType		,outfile);
	w_t_f_d(bmp_header->bfSize		,outfile);
	w_t_f_s(bmp_header->bfReserved1	,outfile);
	w_t_f_s(bmp_header->bfReserved2	,outfile);
	w_t_f_d(bmp_header->bfOffBits	,outfile);
	
	
	w_t_f_d(bmp_info->biSize			,outfile);
	w_t_f_d(bmp_info->biWidth			,outfile);
	w_t_f_d(bmp_info->biHeight		    ,outfile);
	w_t_f_s(bmp_info->biPlanes		    ,outfile);
	w_t_f_s(bmp_info->biBitCount		,outfile);
	w_t_f_d(bmp_info->biCompression	    ,outfile);
	w_t_f_d(bmp_info->biSizeImage		,outfile);
	w_t_f_d(bmp_info->biXPelsPerMeter	,outfile);
	w_t_f_d(bmp_info->biYPelsPerMeter	,outfile);
	w_t_f_d(bmp_info->biClrUsed		    ,outfile);
	w_t_f_d(bmp_info->biClrImportant	,outfile);
	
		for(i=0;i<sizeof(table_16bpp);i++)
			fputc(table_16bpp[i],outfile);
		
		for(i=0;i<240;i++)
		{
			for(j=0;j<320;j++)
			{
				temp=((bmp_size[i][j]>>8)&0xf800)|((bmp_size[i][j]>>5)&0x07e0)|((bmp_size[i][j]>>3)&0x001f);
				fputc(temp&0xff,outfile);
				fputc((temp>>8)&0xff,outfile);
				
			}
		}
		
	#endif
	
	#ifdef DEGUGE
		
		fprintf(outfile,"bmp_header->bfType		    :0x%x\n", bmp_header->bfType			);	
		fprintf(outfile,"bmp_header->bfSize		    :0x%x\n", bmp_header->bfSize			);
		fprintf(outfile,"bmp_header->bfReserved1    :0x%x\n", bmp_header->bfReserved1   	);
		fprintf(outfile,"bmp_header->bfReserved2    :0x%x\n", bmp_header->bfReserved2   	);
		fprintf(outfile,"bmp_header->bfOffBits	    :0x%x\n", bmp_header->bfOffBits	    );

		fprintf(outfile,"bmp_info->biSize			:0x%x\n", bmp_info->biSize			    );	
		fprintf(outfile,"bmp_info->biWidth			:0x%x\n", bmp_info->biWidth			);
		fprintf(outfile,"bmp_info->biHeight		    :0x%x\n", bmp_info->biHeight		    );
		fprintf(outfile,"bmp_info->biPlanes		    :0x%x\n", bmp_info->biPlanes		    );
		fprintf(outfile,"bmp_info->biBitCount		:0x%x\n", bmp_info->biBitCount		    );
		fprintf(outfile,"bmp_info->biCompression	:0x%x\n", bmp_info->biCompression	    );
		fprintf(outfile,"bmp_info->biSizeImage		:0x%x\n", bmp_info->biSizeImage		);
		fprintf(outfile,"bmp_info->biXPelsPerMeter	:0x%x\n", bmp_info->biXPelsPerMeter	);
		fprintf(outfile,"bmp_info->biYPelsPerMeter	:0x%x\n", bmp_info->biYPelsPerMeter	);
		fprintf(outfile,"bmp_info->biClrUsed		:0x%x\n", bmp_info->biClrUsed		    );
		fprintf(outfile,"bmp_info->biClrImportant	:0x%x\n", bmp_info->biClrImportant	    );
		
	#endif
	
	fclose(infile);
	fclose(outfile);

	return 0;
	
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -