代码如下:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#pragma pack(1)
typedef struct tagBITMAPFILEHEADER
{
unsigned char bfType[
2];
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
}fileHeader;
#pragma pack()
#pragma pack(1)
typedef struct tagBITMAPINFOHEADER
{
unsigned long biSize;
long biWidth;
long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
long biXPixPerMeter;
long biYPixPerMeter;
unsigned long biClrUsed;
unsigned long biClrImporant;
}fileInfo;
#pragma pack()
#pragma pack(1)
typedef struct tagRGBQUAD
{
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
}rgbq;
#pragma pack()
int main()
{
FILE *fp1 = fopen(
"C:\\Users\\Administrator\\Desktop\\data\\bmp\\image.bmp",
"rb+");
if (fp1 == NULL)
{
printf(
"打开文件fp1失败");
exit(
0);
}
FILE *fp2 = fopen(
"C:\\Users\\Administrator\\Desktop\\data\\bmp\\imageGray.bmp",
"wb");
if (fp1 == NULL)
{
printf(
"打开文件fp2失败");
exit(
0);
}
fileHeader * fh;
fileInfo * fi;
fh = (fileHeader *)
malloc(
sizeof(fileHeader));
fi = (fileInfo *)
malloc(
sizeof(fileInfo));
fread(fh,
sizeof(fileHeader),
1, fp1);
fread(fi,
sizeof(fileInfo),
1, fp1);
printf(
"\\\\\\\\\\\\\\\\\\\\原始图片信息\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
printf(
"bmp文件头:\n");
printf(
"bfSize:%d\n", fh->bfSize);
printf(
"bfOffBits:%d\n", fh->bfOffBits);
printf(
"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
printf(
"bmp信息头\n");
printf(
"结构体长度:%d \n", fi->biSize);
printf(
"位图宽度:%d \n", fi->biWidth);
printf(
"位图高度:%d \n", fi->biHeight);
printf(
"位图平面数:%d \n", fi->biPlanes);
printf(
"颜色位数:%d \n", fi->biBitCount);
printf(
"压缩方式:%d \n", fi->biCompression);
printf(
"实际位图数据占用的字节数:%d \n", fi->biSizeImage);
printf(
"X方向分辨率:%d \n", fi->biXPixPerMeter);
printf(
"Y方向分辨率:%d \n", fi->biYPixPerMeter);
printf(
"使用的颜色数:%d \n", fi->biClrUsed);
printf(
"重要颜色数:%d \n", fi->biClrImporant);
printf(
"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
fi->biBitCount =
8;
fi->biSizeImage = fi->biHeight*fi->biWidth;
fh->bfOffBits =
sizeof(fileHeader) +
sizeof(fileInfo) +
256 *
sizeof(rgbq);
fh->bfSize = fh->bfOffBits + fi->biSizeImage;
printf(
"\\\\\\\\\\\\\\\\\\\\修改后的图片信息\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
printf(
"bmp文件头:\n");
printf(
"bfSize:%d\n", fh->bfSize);
printf(
"bfOffBits:%d\n", fh->bfOffBits);
printf(
"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
printf(
"bmp信息头\n");
printf(
"结构体长度:%d \n", fi->biSize);
printf(
"位图宽度:%d \n", fi->biWidth);
printf(
"位图高度:%d \n", fi->biHeight);
printf(
"位图平面数:%d \n", fi->biPlanes);
printf(
"颜色位数:%d \n", fi->biBitCount);
printf(
"压缩方式:%d \n", fi->biCompression);
printf(
"实际位图数据占用的字节数:%d \n", fi->biSizeImage);
printf(
"X方向分辨率:%d \n", fi->biXPixPerMeter);
printf(
"Y方向分辨率:%d \n", fi->biYPixPerMeter);
printf(
"使用的颜色数:%d \n", fi->biClrUsed);
printf(
"重要颜色数:%d \n", fi->biClrImporant);
printf(
"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
int i,j,k=
0;
rgbq *fq = (rgbq *)
malloc(
256 *
sizeof(rgbq));
for (i =
0; i<
256; i++)
{
fq[i].rgbBlue = fq[i].rgbGreen = fq[i].rgbRed = i;
}
fwrite(fh,
sizeof(fileHeader),
1, fp2);
fwrite(fi,
sizeof(fileInfo),
1, fp2);
fwrite(fq,
sizeof(rgbq),
256, fp2);
unsigned char ImgData[
3000][
3];
unsigned char ImgData2[
3000];
unsigned char * * bmp_data;
bmp_data =
new unsigned char*[fi->biHeight];
unsigned char *data288 =
new unsigned char[fi->biHeight*fi->biWidth];
for (i =
0; i<fi->biHeight; i++)
bmp_data[i] =
new unsigned char[(fi->biWidth *
3 +
3) /
4 *
4];
for (i =
0; i<fi->biHeight; i++)
for (j =
0; j<(fi->biWidth *
3 +
3) /
4 *
4; j++)
fread(&bmp_data[i][j],
1,
1, fp1);
for (i =
0; i<fi->biHeight; i++)
for (j =
0; j<fi->biWidth; j++){
data288[fi->biWidth*i + j] = ((
unsigned char)((
float)bmp_data[i][
3 * j] *
0.114 + (
float)bmp_data[i][
3 * j +
1] *
0.587 + (
float)bmp_data[i][
3 * j +
2] *
0.299));
}
fwrite(data288, fi->biSizeImage,
1, fp2);
free(fh);
free(fi);
free(fq);
fclose(fp1);
fclose(fp2);
printf(
"success\n");
return 0;
}