脉望虫 2017-09-09 14:10 采纳率: 0%
浏览 2093

麻烦一下各位大佬们,为什么我写的C++程序将彩色图转换成灰度图后,新创建的图像显示不出来

要读取的图像是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;
}

  • 写回答

1条回答

  • shifenglv 2017-09-10 01:58
    关注

    你要是用#pragma pack(2),结构体字节对齐为2字节,那么sizeof(BITMAPINFOHEADER)就会偏大。所以把#pragma pack(2)去掉,或者改为#pragma pack(1),这样结构体的大小刚好等于sizeof(BITMAPINFOHEADER)。

    评论

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码