实验2-图像文件的读写与转换

实验要求:

完成不同像素深度的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;

}

实验结果:

实验所得图片的颜色因为调色板的设置原因,与原图略有不同。
原图
24BIT转8BIT

8BIT转24BIT

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值