// 570
/***********************************
* *
* *
* *
* * 400
* *
* *
* *
************************************/
#include<stdio.h>
#include<windows.h>
int main()
{
FILE* fp;
errno_t err;
unsigned int j, k;
BITMAPFILEHEADER FileHeader;
BITMAPINFOHEADER InfoHeader;
RGBQUAD *IpRGBQuad;
char FileName[30];
IpRGBQuad = (RGBQUAD *)malloc(256*sizeof(RGBQUAD));//灰度图为8位的调色板数据为256个结构,1024个字节
strcpy_s(FileName, "F:\256.bmp");
err = fopen_s(&fp,FileName, "rb");
if( err!=0 )
{
printf_s("cannot open this file");
return 0;
}
/*
int r1,r18,r19;
int width=0;
for(int i=0;i<=53;i++)
{
r1=getc(fp);
if(i==19)
r19=(int)r1;
if(i==18)
r18=(int)r1;
fwrite(&r1,sizeof(char),1,fp);
}//前53个字节包含了文件信息,所以直接复制,其中width信息存在18到21中,且倒着存的
width=width+r19*256+r18;//计算width
fseek(fp,0L,0);
fseek(fp,0L,0);
*/
//读取位图文件头
printf_s("
------------------------位图文件头----------------------------------------
");
fread(&FileHeader, sizeof(FileHeader), 1, fp);
printf_s("文件类型%X
",FileHeader.bfType);
printf_s("文件大小(单位字节):%lu
", FileHeader.bfSize);
printf_s("备用:%X
", FileHeader.bfReserved1);
printf_s("备用:%X
", FileHeader.bfReserved2);
printf_s("图像开始处的字节偏移:%lu
", FileHeader.bfOffBits);
//读取位图信息头
printf_s("
-------------------------位图信息头----------------------------------------
");
fread(&InfoHeader, sizeof(InfoHeader), 1, fp);
printf_s("信息头大小:%lu
", InfoHeader.biSize);
printf_s("图像宽度:%d
", InfoHeader.biWidth);
printf_s("图像高度:%d
", InfoHeader.biHeight);
printf_s("位平面数:%d
", InfoHeader.biPlanes);
printf_s("每像素位数:%d
", InfoHeader.biBitCount);
printf_s("压缩类型:%lu
", InfoHeader.biCompression);
printf_s("压缩图像大小的字节数:%lu
", InfoHeader.biSizeImage);
printf_s("水平分辨率:%ld
", InfoHeader.biXPelsPerMeter);
printf_s("垂直分辨率:%ld
", InfoHeader.biYPelsPerMeter );
printf_s("使用的色彩数:%lu
", InfoHeader.biClrUsed);
printf_s("重要色彩数:%lu
", InfoHeader.biClrImportant);
//读取调色板数据
//printf_s("
-----------------------------调色板------------------------------------------
");
//printf_s(" 红 绿 蓝
");
fread(IpRGBQuad, sizeof(RGBQUAD), 256, fp);
for (int i = 0; i < 256; i++)
{
//printf(" %X %X %X
",IpRGBQuad[i].rgbBlue , IpRGBQuad[i].rgbGreen , IpRGBQuad[i].rgbRed );
}
//读取像素数据
InfoHeader.biWidth = InfoHeader.biWidth+2; /**************这里为什么要加2????*************/
long sizei = InfoHeader.biWidth*InfoHeader.biHeight;
char bitMap[400][572]; //这个值就是上面的 biHeight 和 biWidth
fread(bitMap,sizeof(char),sizei,fp);
//使100行全部变黑
for(int i = 0;i<InfoHeader.biWidth;i++){
if(i>200&&i<400)
bitMap[100][i]=0;
}
//使300行全部变黑
for(int i = 0;i<InfoHeader.biWidth;i++){
if(i>200&&i<400)
bitMap[300][i]=0;
}
//使每一行的200列变黑
for(int i = 0;i<InfoHeader.biHeight;i++){
if(i>100&&i<300)
bitMap[i][200]=0;
}
//使每一行的400列变黑
for(int i = 0;i<InfoHeader.biHeight;i++){
if(i>100&&i<300)
bitMap[i][400]=0;
}
FILE*pfout=fopen("F:\myPic.bmp","wb");
//写文件头
fwrite(&FileHeader,sizeof(FileHeader),1,pfout);
//写信息头
fwrite(&InfoHeader,sizeof(InfoHeader),1,pfout);
//写调色板
fwrite(IpRGBQuad,sizeof(RGBQUAD),256,pfout);
//写像素点
fwrite(bitMap,sizeof(char),sizei,pfout);
free(IpRGBQuad);
fclose(fp);
fclose(pfout);
printf("------------------------正常结束---------------------------------
");
system("pause");
return 0;
}