📄 main_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 + -