要读取的图像是24位彩色图,所以没加调色板信息,不当之处烦请指出来,谢谢你们
#include
#include
#include
#pragma pack(2)
#define PI 3.14159265
using namespace std;
int main()
{
BITMAPFILEHEADER bfh; //位图头文件
BITMAPINFOHEADER bih; //位图信息文件
unsigned char src_buff; //存储原图像素数据
unsigned char *dst_buff; //存储变换后图像素数据
BYTE tmp;
BYTE z=0; //调色板保留值
int i;
unsigned long j=0; //循环变量
FILE *fin; //要读取的图像
fin=fopen("D:\53119064724449.bmp","rb");
if(fin==NULL)
cout<<"文件打开失败"<<endl;
fread(&bfh,sizeof(BITMAPFILEHEADER),1,fin);//读取位图头文件
if(bfh.bfType==0x4d42) //判断是不是BMP文件
cout<<"这是一个BMP图片"<<endl;
cout<<"图片的大小是"<<bfh.bfSize<<endl;
fread(&bih,sizeof(BITMAPINFOHEADER),1,fin); //读取位图信息文件
cout<<"图像的位数是"<<bih.biBitCount<<endl;
src_buff=new unsigned char[bih.biHeight*bih.biWidth*3]; //给缓存区分配内存
fread(src_buff,sizeof(BYTE),bih.biHeight*bih.biWidth*3,fin); //读取图像素数据
dst_buff=new unsigned char[bih.biHeight*bih.biWidth]; //给缓存区分配内存
for (unsigned long i=0;i<bih.biHeight*bih.biWidth*3;i+=3) //灰度处理
{
tmp=(0.299*src_buff[i]+0.587*src_buff[i+1]+0.114*src_buff[i+2]);
dst_buff[j++]=(BYTE)tmp;
}
bfh.bfSize=bfh.bfOffBits+256*4+bih.biWidth*bih.biHeight; //256*4是调色板占的字节数
bfh.bfOffBits=bfh.bfOffBits+256*4;
FILE fout=fopen("D:\huayanda2(5).bmp","wb+"); //创建新文件
fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fout); //写位图头文件
bih.biBitCount=8; //8位灰度图
bih.biSizeImage=( (bih.biWidth+3)/4 ) * 4*bih.biHeight; //像素数据大小
fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fout); //写入像素数据
for( i=0;i<256;i++)
{
fwrite(&i,sizeof(BYTE),1,fout);
fwrite(&i,sizeof(BYTE),1,fout);
fwrite(&i,sizeof(BYTE),1,fout);
fwrite(&z,sizeof(BYTE),1,fout);
}
fwrite(dst_buff,sizeof(BYTE),bih.biHeight*bih.biWidth,fout); //写入调色板信息
cout<<"god job"<<endl;
delete[] src_buff; //释放内存
delete[] dst_buff;
return 0;
}

麻烦一下各位大佬们,为什么我写的C++程序将彩色图转换成灰度图后,新创建的图像显示不出来
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- shifenglv 2017-09-10 01:58关注
你要是用#pragma pack(2),结构体字节对齐为2字节,那么sizeof(BITMAPINFOHEADER)就会偏大。所以把#pragma pack(2)去掉,或者改为#pragma pack(1),这样结构体的大小刚好等于sizeof(BITMAPINFOHEADER)。
解决 无用评论 打赏 举报