rendered paste body#include "BMP_Image.h"
#include <fstream>
using namespace std;
BMP_Image::BMP_Image(std::string& str) {
ifstream ifile;
ifile.open(str.c_str(), ios::in | ios::binary);
//read file header
ifile.read((char *)(&fh.bfType), sizeof(word));
ifile.read((char *)(&fh.bfSize), sizeof(dword));
ifile.read((char *)(&fh.bfReserved1), sizeof(word));
ifile.read((char *)(&fh.bfReserved2), sizeof(word));
ifile.read((char *)(&fh.bfOffBits), sizeof(dword));
//read info header
ifile.read((char *)(&ih.biSize), sizeof(dword));
ifile.read((char *)(&ih.biWidth), sizeof(dword));
ifile.read((char *)(&ih.biHeight), sizeof(dword));
ifile.read((char *)(&ih.biPlanes), sizeof(word));
ifile.read((char *)(&ih.biBitCount), sizeof(word));
ifile.read((char *)(&ih.biCompression), sizeof(dword));
ifile.read((char *)(&ih.biSizeImage), sizeof(dword));
ifile.read((char *)(&ih.biXpelsPerMeter), sizeof(dword));
ifile.read((char *)(&ih.biYpelsPerMeter), sizeof(dword));
ifile.read((char *)(&ih.biClrUsed), sizeof(dword));
ifile.read((char *)(&ih.biClrImportant), sizeof(dword));
//24 bits bitmaps don't have a palette.
//read image data
image = new Pixel*[ih.biHeight];
//calculate line length in bytes.
int padding = (4 - ((ih.biWidth * 3) % 4)) % 4; //32-bits aligned, number of bytes padded
ifile.seekg(fh.bfOffBits);
byte red, green, blue;
for (unsigned int i = 0; i < ih.biHeight; i++) { //read image data in lines
image[i] = new Pixel[ih.biWidth];
for (unsigned int j = 0; j < ih.biWidth; j++) {
ifile.read((char *)(&blue), sizeof(byte));
ifile.read((char *)(&green), sizeof(byte));
ifile.read((char *)(&red), sizeof(byte));
image[i][j].setColor(red, green, blue);
}
ifile.seekg(padding, ios_base::cur); //skip the padded bytes
}
ifile.close();
}
BMP_Image::~BMP_Image() {
}
long BMP_Image::getWidth() { return ih.biWidth; }
long BMP_Image::getHeight() { return ih.biHeight; }
void BMP_Image::drawPixel(Pixel p, long Xpos, long Ypos) { image[Ypos][Xpos].setColor(p.getRed(), p.getGreen(), p.getBlue()); }
Pixel BMP_Image::getPixel(long Xpos, long Ypos) { return image[Ypos][Xpos]; }
void BMP_Image::writeToFile(std::string& str) {
ofstream ofile;
ofile.open(str.c_str(), ios::out | ios::binary);
//write file header
ofile.write((char *)(&fh.bfType), sizeof(word));
ofile.write((char *)(&fh.bfSize), sizeof(dword));
ofile.write((char *)(&fh.bfReserved1), sizeof(word));
ofile.write((char *)(&fh.bfReserved2), sizeof(word));
ofile.write((char *)(&fh.bfOffBits), sizeof(dword));
//write info header
ofile.write((char *)(&ih.biSize), sizeof(dword));
ofile.write((char *)(&ih.biWidth), sizeof(dword));
ofile.write((char *)(&ih.biHeight), sizeof(dword));
ofile.write((char *)(&ih.biPlanes), sizeof(word));
ofile.write((char *)(&ih.biBitCount), sizeof(word));
ofile.write((char *)(&ih.biCompression), sizeof(dword));
ofile.write((char *)(&ih.biSizeImage), sizeof(dword));
ofile.write((char *)(&ih.biXpelsPerMeter), sizeof(dword));
ofile.write((char *)(&ih.biYpelsPerMeter), sizeof(dword));
ofile.write((char *)(&ih.biClrUsed), sizeof(dword));
ofile.write((char *)(&ih.biClrImportant), sizeof(dword));
//write image data
int padding = (4 - ((ih.biWidth * 3) % 4)) % 4; //32-bits aligned, number of bytes padded
ofile.seekp(fh.bfOffBits);
Pixel cp;
byte tmp;
for (unsigned int i = 0; i < ih.biHeight; i++) {
for (unsigned int j = 0; j < ih.biWidth; j++) {
cp = image[i][j];
tmp = cp.getBlue();
ofile.write((char *)(&tmp), sizeof(byte));
tmp = cp.getGreen();
ofile.write((char *)(&tmp), sizeof(byte));
tmp = cp.getRed();
ofile.write((char *)(&tmp), sizeof(byte));
}
ofile.seekp(padding, ios_base::cur); //skip the padded bytes
}
ofile.close();
}