实验要求:
完成不同像素深度的BMP文件互换
实验原理:
1.8bit转换为24bit
只需将原8bit图像实际位图数据通过查找调色板获得对应的RGB索引值直接写入到24bit图像的实际位图数据中。
2.24bit转换成8bit
先自行设定转换规则,将24bit图像的实际位图数据根据转换规则转换为8bit图像的实际位图数据。
实验过程:
#include<stdio.h>
#include<Windows.h>
int main(int argc,char** argv)
{
char *filename_8,*filename_24;
filename_8=argv[1];
filename_24=argv[2];
BITMAPFILEHEADER eight_bit_f,twenty_4_bit_f;
BITMAPINFOHEADER eight_bit_info,twenty_4_bit_info;
RGBQUAD eight_color_buffer[256];
unsigned char *eight_buffer=NULL,*twenty_4_buffer=NULL;
unsigned char *twenty_4_buffer_wr;
unsigned char *eight_buffer_del,*twenty_4_buffer_del;
FILE *fp_8,*fp_24;
fp_8=fopen(filename_8,“rb”);
fp_24=fopen(filename_24,“wb”);
fread(&eight_bit_f,sizeof(BITMAPFILEHEADER),1,fp_8);
fread(&eight_bit_info,sizeof(BITMAPINFOHEADER),1,fp_8);
fread(&eight_color_buffer,sizeof(RGBQUAD),256,fp_8);
int size=eight_bit_info.biSizeImage;
eight_buffer=new unsigned char[size];
twenty_4_buffer=new unsigned char[3*size];
if(eight_buffer==NULL||twenty_4_buffer==NULL)
{
printf("can not new unsigned char/n");
}
int size_arc=size;
if((eight_bit_info.biHeight%4!=0) && (eight_bit_info.biWidth%4!=0))
{
size_arc=eight_bit_info.biHeight*eight_bit_info.biWidth;
}
fread(eight_buffer,sizeof(unsigned char),size,fp_8);
twenty_4_buffer_wr=twenty_4_buffer;
twenty_4_buffer_del=twenty_4_buffer;
eight_buffer_del=eight_buffer;
if(eight_bit_f.bfType!=0x4D42)
printf("please input .bmp file/n");
}
for(int i=0;i<size_arc;i++)
{
*(twenty_4_buffer+2)=(eight_color_buffer[*eight_buffer]).rgbRed;
*(twenty_4_buffer+1)=(eight_color_buffer[*eight_buffer]).rgbGreen;
*(twenty_4_buffer)=(eight_color_buffer[*eight_buffer]).rgbBlue;
twenty_4_buffer+=3;
eight_buffer++;
}
if(size!=size_arc)
{
for(int i=0;i<(size-size_arc);i++)
{
*(twenty_4_buffer+2)=*(twenty_4_buffer+1)=*(twenty_4_buffer)=0;
twenty_4_buffer+=3;
}
}
twenty_4_bit_f.bfType=0x4D42;
twenty_4_bit_f.bfSize=(14+40+3*size);
twenty_4_bit_f.bfReserved1=0;
twenty_4_bit_f.bfReserved2=0;
twenty_4_bit_f.bfOffBits=14+40;
twenty_4_bit_info.biSize=40;
twenty_4_bit_info.biWidth=eight_bit_info.biWidth;
twenty_4_bit_info.biHeight=eight_bit_info.biHeight;
twenty_4_bit_info.biBitCount=24;
twenty_4_bit_info.biPlanes=1;
twenty_4_bit_info.biCompression=eight_bit_info.biCompression;
twenty_4_bit_info.biSizeImage=3*eight_bit_info.biSizeImage;
twenty_4_bit_info.biXPelsPerMeter=eight_bit_info.biXPelsPerMeter;
twenty_4_bit_info.biYPelsPerMeter=eight_bit_info.biYPelsPerMeter;
twenty_4_bit_info.biClrUsed=0;
twenty_4_bit_info.biClrImportant=0;
fwrite(&twenty_4_bit_f,sizeof(BITMAPFILEHEADER),1,fp_24);
fwrite(&twenty_4_bit_info,sizeof(BITMAPINFOHEADER),1,fp_24);
fwrite(twenty_4_buffer_wr,sizeof(unsigned char),3*size,fp_24);
fclose(fp_8);
fclose(fp_24);
delete[] eight_buffer_del;
delete[] twenty_4_buffer_del;
return 0;
}
实验结果:
实验所得图片的颜色因为调色板的设置原因,与原图略有不同。