数字图像处理学习笔记(1.0)---位图的读写、几何变换、傅里叶变换、直方图均衡

位图的读写


#include"bmp.h"
#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;


Bitmap::Bitmap()
{

}

Bitmap::~Bitmap()
{
	if (dataBuf!=NULL)
		delete[] dataBuf;
	dataBuf = NULL;
	if (colorTable != NULL)
		delete[] colorTable;
	colorTable = NULL;
}

bool Bitmap::read(char* fileName)
{
	FILE* f = fopen(fileName, "rb");
	if (f == NULL)
		return false;

	if (dataBuf != NULL)//释放旧的图像数据内存和颜色表内存
		delete[] dataBuf;
	if (colorTable != NULL)
		delete[] colorTable;
	dataBuf = NULL;
	colorTable = NULL;
	
	fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, f);
	fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, f);

	width_p = infoHeader.biWidth;
	height_p = infoHeader.biHeight;
	bitCount = infoHeader.biBitCount;

	if (bitCount == 8)
	{
		colorTable = new RGBQUAD[256];
		fread(colorTable, sizeof(RGBQUAD), 256, f);
	}

	dataBuf = new unsigned char[infoHeader.biSizeImage];
	fread(dataBuf, 1, infoHeader.biSizeImage, f);

	fclose(f);
	return 1;
}

bool Bitmap::write(char* fileName)
{
	FILE* f = fopen(fileName, "wb");
	if (f == NULL)
		return false;

	int colorTableSize = 0;
	if (bitCount == 8)
		colorTableSize = sizeof(RGBQUAD)* 256;

	int headerSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTableSize;
	int lineSize = (width_p*bitCount / 8 + 3) / 4 * 4;
	int dataSize = lineSize*height_p;

	fileHeader.bfType = 0x4D42;
	fileHeader.bfSize = headerSize + dataSize;
	fileHeader.bfReserved1 = 0;
	fileHeader.bfOffBits = headerSize;

	infoHeader.biSize = 40;
	infoHeader.biWidth = width_p;
	infoHeader.biHeight = height_p;
	infoHeader.biPlanes = 1;
	infoHeader.biBitCount = bitCount;
	infoHeader.biCompression = BI_RGB;
	infoHeader.biSizeImage = dataSize;
	infoHeader.biXPelsPerMeter = 0;
	infoHeader.biYPelsPerMeter = 0;
	infoHeader.biClrUsed = 0;
	infoHeader.biClrImportant = 0;

	fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, f);
	fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, f);
	if (bitCount == 8)
	{
		fwrite(colorTable, sizeof(RGBQUAD), 256, f);
	}
	fwrite(dataBuf, 1, dataSize, f);

	fclose(f);
	return true;
}

测试:

#include"bmp.h"
#include<iostream>

using namespace std;

int main()
{
	char* fileName = "qianxun.bmp";
	Bitmap* bmp = new Bitmap();
	bmp->read(fileName);
	bmp->write("write.bmp");
	delete bmp;
	return 1;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值