Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "BMP_Image.h"
- using namespace std;
- /*BMP_Image::BMP_Image() {
- fh.bfType=19778;
- fh.bfReserved1=0;
- fh.bfReserved2=0;
- ih.biPlanes=1;
- ih.biBitCount=24;
- ih.biCompression=0;
- ih.biXpelsPerMeter=0;
- ih.biYpelsPerMeter=0;
- ih.biClrImportant=0;
- }*/
- BMP_Image::BMP_Image(std::string &str) {
- ifstream ifile;
- ifile.open(str.c_str() ,ios::binary | ios::in);
- 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));
- 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));
- unsigned long hoogte=ih.biWidth;
- unsigned long breedte=ih.biHeight;
- image= new Pixel*[hoogte];
- unsigned long i,k,l;
- for(i=0;i<hoogte;i++) {
- image[i]=new Pixel[breedte];
- }
- // één byte is 8 bits!
- //prentje zal zo lang zijn: ih.biWidth*24
- //maar moet veelvoud van 32 zijn => ih.biWidth*24%32 aanvullen tot 32 voud
- // er gaan 32-((ih.biWidth*24)%32) nulbits zijn
- char* rest=new char[(32-((ih.biWidth*24)%32))/8];
- for(k=0;k<hoogte;k++) { // per k wordt 1 scanlijn ingelezen
- for(l=0;l<breedte;l++) { //l doorloopt deze scanlijn
- byte ingelezen;
- ifile.read((char*)(&ingelezen),sizeof(byte));
- image[k][l].setRed(ingelezen);
- ifile.read((char*)(&ingelezen),sizeof(byte));
- image[k][l].setGreen(ingelezen);
- ifile.read((char*)(&ingelezen),sizeof(byte));
- image[k][l].setBlue(ingelezen);
- }
- ifile.read(rest,(32-((ih.biWidth*24)%32))/8*sizeof(byte));
- }
- ifile.close();
- /*int test_veelvoud = 8*(ih.biWidth*sizeof(Pixel))%32; //in bits
- if(test_veelvoud != 0) //laatste 32 tal aanvullen met 32-test_veelvoud # 0en
- test_veelvoud = 32 - test_veelvoud; //aantal nodige nullen
- test_veelvoud /= 8;
- byte*ruimte=new byte[3];*/
- }
- 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[Xpos][Ypos]=p;
- }
- Pixel BMP_Image::getPixel(long Xpos, long Ypos){
- return image[Xpos][Ypos];
- }
- void BMP_Image::writeToFile(std::string& str){
- ofstream ofile;
- ofile.open(str.c_str() ,ios::binary | ios::out);
- 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));
- 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));
- unsigned long hoogte=ih.biWidth;
- unsigned long breedte=ih.biHeight;
- // één byte is 8 bits!
- //prentje zal zo lang zijn: ih.biWidth*24
- //maar moet veelvoud van 32 zijn => ih.biWidth*24%32 aanvullen tot 32 voud
- // er gaan 32-((ih.biWidth*24)%32) nulbits zijn
- int rest=(32-((ih.biWidth*24)%32))/8; // of rest aantal nulbytes
- int m;
- byte n=0;
- unsigned long k,l;
- for(k=0;k<hoogte;k++) { // per k wordt 1 scanlijn ingelezen
- for(l=0;l<breedte;l++) { //l doorloopt deze scanlijn
- byte ingelezen;
- ingelezen=(image[k][l]).getRed();
- ofile.write((char*)&ingelezen,sizeof(byte));
- ingelezen=image[k][l].getGreen();
- ofile.write((char*)(&ingelezen),sizeof(byte));
- ingelezen=image[k][l].getBlue();
- ofile.write((char*)(&ingelezen),sizeof(byte));
- }
- for(m=0;m<rest-3;m++) {
- ofile.write((char*)(&n),sizeof(byte));
- }
- }
- ofile.close();
- }
Add Comment
Please, Sign In to add comment