位图的读写
#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;
}