谢谢诸位大佬,我觉得没什么毛病了啊……
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
/* bmp文件头 */
#pragma pack(1)
typedef struct BMPFILEHEADER
{
BYTE bfType; //文件类型,必须是0x424D,即字符“BM”
DWORD bSize; // 文件的大小
WORD bReserved1; // 保留值,必须设置为0
WORD bReserved2; // 保留值,必须设置为0
DWORD bOffset; // 文件头的最后到图像数据位开始的偏移量
}BMPHeader;
#pragma pack()
/* 位图数据信息结构*/
#pragma pack(1)
typedef struct BMP_INFO
{
DWORD bInfoSize; // 结构的大小
long bWidth; // 图像的宽度
long bHeight; // 图像的高度
WORD bPlanes; // 图像的平面数
WORD bBitCount; // 颜色/像素的位数
DWORD bCompression; // 压缩类型
DWORD bmpImageSize; // DIB数据区的大小,以字节为单位
long bXPelsPerMeter; // 水平分辨率
long bYPelsPerMeter; // 垂直分辨率
DWORD bClrUsed; // 使用的色彩数
DWORD bClrImportant; // 重要的颜色数
}BMPInfo;
#pragma pack()
/* 彩色表:调色板 */
#pragma pack(1)
typedef struct RGB_QUAD
{
BYTE rgbBlue; // 蓝色强度
BYTE rgbGreen; // 绿色强度
BYTE rgbRed; // 红色强度
BYTE rgbReversed; // 保留值
}RGB;
#pragma pack()
int main()
{
FILE *fp,*fg;
BMPHeader *fh;
BMPInfo *fi;
RGB *fq;
BYTE data[2000][2000][3]; //存储RGB图像的像素点
BYTE yuv[2000][2000][3]; //yuv
BYTE data_gray[2000]; //存储灰度图像的像素点
int i,j,k;
printf("%d",0);
fp=fopen("test.bmp","rb"); //打开bmp文件
if (fp==NULL){
printf("Can't open the file!\n");
return 0;
}
fh=(BMPHeader*)malloc(sizeof(BMPHeader));
fi=(BMPInfo*)malloc(sizeof(BMPInfo)); //读取位图头结构和信息头
fread(fh,sizeof(BMPHeader),1,fp);
fread(fi,sizeof(BMPInfo),1,fp); //修改头信息
fi->bBitCount=8;
fi->bmpImageSize=((fi->bWidth*3+3)/4)*4*fi->bHeight;
//fi->biClrUsed=256;
fh->bOffset=sizeof(BMPHeader)+sizeof(BMPInfo)+256*sizeof(RGB);
fh->bSize=fh->bOffset+fi->bmpImageSize;
printf("%d",123);
for(i=0;i<fi->bHeight;i++) //读取RGB图像像素
{
for(j=0;j<(fi->bWidth+3)/4*4;j++)
{
for(k=0;k<3;k++){
fread(&data[i][j][k],1,1,fp);
}
}
}
/*rgb2yuv*/
for(i=0;i<fi->bHeight;i++)
{
for(j=0;j<(fi->bWidth+3)/4*4;j++)
{
yuv[i][j][0]=0.299*data[i][j][2]+0.587*data[i][j][1]+0.114*data[i][j][0];//Y
yuv[i][j][1]=0.493*(data[i][j][2]-yuv[i][j][0]);//U
yuv[i][j][2]=0.877*(data[i][j][2]-yuv[i][j][0]);//V
}
}
/*创建灰色图像*/
fg=fopen("gray.bmp","wb");
if(fg==NULL)
printf("Wrong!(write a gray bmp)\n");
//创建调色板
fq=(RGB*)malloc(256*sizeof(RGB));
for(i=0;i<256;i++)
{
fq[i].rgbBlue=fq[i].rgbGreen=fq[i].rgbRed=i;
//fq[i].rgbReversed=0;
}
fwrite(fh,sizeof(BMPHeader),1,fg); //将头信息写入
fwrite(fi,sizeof(BMPInfo),1,fg);
fwrite(fq,sizeof(RGB),256,fg);
for(i=0;i<fi->bHeight;i++){ //读取yuv中的Y值并写入灰度图
for(j=0;j<(fi->bWidth+3)/4*4;j++){
data_gray[j]=(int)yuv[i][j][0];
}
fwrite(data_gray,j,1,fg);
}
free(fh);
free(fi);
free(fq);
fclose(fp);
fclose(fg);
return 0;
}