c++实现bmp文件的读写

本文介绍了一个C++实现BMP文件读写的程序,包括四个关键文件:bmpstruct.h、cBMPimage.h、cBMPimage.cpp和main.c。在处理8位灰度图时遇到读写错误,原因是fopen函数以文本模式打开BMP文件导致颜色表读取失败。解决方案是使用'rb+'模式以二进制方式打开文件,避免因0x1A(ASCII的EOF)导致的提前结束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


程序分为bmp相关的三个文件以及一个实例文件:

 1.bmp格式文件的结构体定义--  bmpstruct.h

 2.bmp格式文件的类定义文件-- cBMPimage.h

 3.bmp格式文件的类实现文件 - cBMPimage.cpp

  4示例文件--main.c

 

1.bmpstruct.h

#ifndef BMPSTRUCT
#define BMPSTRUCT
//~~~~~~~~~~~~~~~~~~结构体定义~~~~~~~~~~~~~~~~~~~~~~~~//
typedef struct tagBMPHEADER
{
	unsigned short bfType; //文件类型
	unsigned long bfSize; //bmp文件长度
	WORD Reserved1;
	WORD Reserved2;
	unsigned long bfOffset; //文件描述区长度,16色为118,256色为1078

}BMPHEADER;//现在算一下,有3个int,2个long,正好3*2+2*4=14字节


//图像信息区
typedef struct  tagBMPINFOHEADER
{
	DWORD biSize;
	LONG biWidth;
	LONG biHeight;
	WORD biPlanes;
	WORD biBitCount;
	DWORD biCompression;
	DWORD biSizeImage;
	LONG biXplosPerMeter;
	LONG biYplosPerMeter;
	DWORD biClrUsed;
	DWORD biClrImportant;

} BMPINFOHEADER;// 2+2*9*4 =40 字节?有疑问
//调色板
typedef struct tagBMPRGBQUAD
{
	BYTE rgbBlue;
	BYTE rgbGreen;
	BYTE rgbRed;
	BYTE rgbReserve;
} BMPRGBQUAD;
//位图数据
typedef struct  tagIMAGEDATA
{
	BYTE red;
	BYTE green;
	BYTE blue;
}IMAGEDATA;

#endif


2.cBMPimage.h

#pragma once
#include <stdio.h>
#include  <windows.h>

#include "bmpstruct.h"

class cBMPimage
{
public:
		BMPHEADER file;
		BMPINFOHEADER info;
		BMPRGBQUAD *palette;
		IMAGEDATA *imagedata;

public:
	cBMPimage(void);
	~cBMPimage(void);

public:
	int GetBmpSize(FILE *fp) ;
	int bmpload(const char* filename);
	int bmpsave(const char* filename);
	int bmpcopypara(cBMPimage *bmpimage);
};

 

  3.cBMPimage.cpp  (实际使用时最好将printf去掉)

#include "cBMPimage.h"


cBMPimage::cBMPimage(void)
{
	palette = NULL;
	imagedata = NULL;
}


cBMPimage::~cBMPimage(void)
{
	if (palette!=NULL)
	{free(palette);
	palette = NULL;
	}
	if (imagedata!=NULL)
	{free(imagedata);
	imagedata= NULL;
	}
}

int cBMPimage::GetBmpSize( FILE *fp )
{
	long curpos;   // attention! this is a long type.   
	int len;  
	curpos = ftel
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值