脉望虫 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)。

    评论

报告相同问题?

悬赏问题

  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP