-
Notifications
You must be signed in to change notification settings - Fork 0
/
BMP.cpp
104 lines (84 loc) · 2.01 KB
/
BMP.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include"BMP.h"
#include<cstdio>
#include<fstream>
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
const double EPS = 1e-6;
BMP::BMP( int H , int W ) {
Initialize( H , W );
Allocate( H, W );
}
BMP::~BMP() {
Release();
}
void BMP::Initialize( int H , int W ) {
strHead.bfReserved1 = 0;
strHead.bfReserved2 = 0;
strHead.bfOffBits = 54;
strInfo.biSize = strHead.bfOffBits - sizeof(strInfo);
strInfo.biPlanes = 1;
strInfo.biHeight = H;
strInfo.biWidth = W;
strInfo.biBitCount = 24;
strInfo.biCompression = 0;
strInfo.biSizeImage = H * W * 3;
strInfo.biXPelsPerMeter = 0;
strInfo.biYPelsPerMeter = 0;
strInfo.biClrUsed = 0;
strInfo.biClrImportant = 0;
strHead.bfSize = strInfo.biSizeImage + strInfo.biBitCount;
}
void BMP::Release() {
//for ( int i = 0 ; i < strInfo.biHeight ; i++ )
// delete[] ima[i];
delete[] ima;
}
void BMP::Allocate(int H, int W) {
//ima = new IMAGEDATA*[H];
//for (int i = 0; i < H; i++)
// ima[i] = new IMAGEDATA[W];
ima = new GLubyte[H * W * 3];
}
void BMP::Input( std::string file ) {
Release();
FILE *fpi;
errno_t err;
if ((err = fopen_s(&fpi, file.c_str(), "rb")) != 0) {
printf("Failed to open file %s\n", file.c_str());
fclose(fpi);
exit(-1);
}
if (fread(&strHead, 1, sizeof(BITMAPFILEHEADER), fpi) < 1) {
printf("Failed to load bmp file.\n");
fclose(fpi);
exit(-1);
}
if (strHead.bfType != 'MB') {
printf("Not a bmp file.\n");
fclose(fpi);
exit(-1);
}
if (fread(&strInfo, 1, sizeof(BITMAPINFOHEADER), fpi) < strHead.bfOffBits - sizeof(BITMAPINFOHEADER)) {
printf("Could not load bmp file.\n");
fclose(fpi);
exit(-1);
}
Allocate( strInfo.biHeight , strInfo.biWidth );
int bitsize = strInfo.biSizeImage;
if (bitsize == 0)
bitsize = (strInfo.biWidth *
strInfo.biBitCount + 7) / 8 *
abs(strInfo.biHeight);
int byteread = fread(ima, 1, bitsize, fpi);
if (byteread < bitsize) {
printf("Failed to read image data.\n");
fclose(fpi);
exit(-1);
}
fclose( fpi );
}
GLubyte* BMP::GetPixels() {
return (GLubyte *)ima;
}