位图(BMP)文件主要包括文件头,图像信息头,调色板和图像数据等四个部分。24位位图由于是RGB真彩色,所以没有调色板;灰度图是8位位图,因此必须要有调色板。
关于BMP文件的结构,更详细的内容可以参考: bmp文件格式详解。
关于BMP文件的结构,更详细的内容可以参考: bmp文件格式详解。
将24位真彩BMP图像灰度化的代码如下:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;
void main()
{
FILE* stream=fopen("Source.bmp","rb");
if(stream==NULL)
{
cout<<"文件不存在"<<endl;
return;
}
int sizeFileHeader=sizeof(BITMAPFILEHEADER);
int sizeInfoHeader=sizeof(BITMAPINFOHEADER);
BITMAPFILEHEADER* bitmapFileHeader=new BITMAPFILEHEADER[sizeFileHeader+1];
BITMAPINFOHEADER* bitmapInfoHeader=new BITMAPINFOHEADER[sizeInfoHeader+1];
memset(bitmapFileHeader,0,sizeFileHeader+1);
memset(bitmapInfoHeader,0,sizeInfoHeader+1);
fread(bitmapFileHeader,sizeof(char),sizeFileHeader,stream);
fseek(stream,sizeFileHeader,0);
fread(bitmapInfoHeader,sizeof(char),sizeInfoHeader,stream);
int srcImageLineByteCount=(((bitmapInfoHeader->biWidth*24)+31)/32)*4;
int destImageLineByteCount=(((bitmapInfoHeader->biWidth)*8+31)/32)*4;
//************位图信息头**********************
BYTE** oldImageData=new BYTE*[bitmapInfoHeader->biHeight];
for(int i=0;i<bitmapInfoHeader->biHeight;i++)
{
oldImageData[i]=new BYTE[