C++实现24位位图的灰度化

本文介绍了如何使用C++将24位真彩色BMP图像转换为灰度图像。关键步骤包括修改信息头、创建调色板、计算灰度值并按顺序写入BMP文件的各个部分。程序需注意二进制写入以保持文件格式正确,并且未处理内存释放问题。
摘要由CSDN通过智能技术生成
  位图(BMP)文件主要包括文件头,图像信息头,调色板和图像数据等四个部分。24位位图由于是RGB真彩色,所以没有调色板;灰度图是8位位图,因此必须要有调色板。
  关于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[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值