-
Notifications
You must be signed in to change notification settings - Fork 0
/
textureBMP.cpp
61 lines (50 loc) · 1.59 KB
/
textureBMP.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
#include "textureBMP.h"
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
TextureBMP::TextureBMP(const char* imagePath) {
unsigned char header[54];
unsigned int imageSize; // = width*height*3
// Apre il file
FILE * file = fopen(imagePath,"rb");
if (!file){printf("Immagine non trovata\n"); return;}
if ( fread(header, 1, 54, file)!=54 ){ // Controlla che l'header sia di 54 byte
printf("Header BMP errato\n");
data = NULL;
return;
}
if ( header[0]!='B' || header[1]!='M' ){
printf("Header BMP errato\n");
data = NULL;
return;
}
// Informazioni dell'header
imageSize = *(int*)&(header[0x22]);
width = *(int*)&(header[0x12]);
height = *(int*)&(header[0x16]);
// Check dei parametri
if (imageSize == 0) imageSize=width*height*3;
// Crea lo spazio in memoria
data = new unsigned char [imageSize];
//cout << "W: "<<width <<" H: "<<height <<" S: "<<imageSize<<endl;
// Carica i dati dal file
fread(data,1,imageSize,file);
fclose(file);
// I file BMP sono salvati con BGR anziché RBG, è necessario fare lo swap dei due canali
for(int i = 0; i < width * height ; ++i)
{
int index = i*3;
unsigned char B,R;
B = data[index];
R = data[index+2];
data[index] = R;
data[index+2] = B;
}
};
TextureBMP::~TextureBMP() {
delete[] data;
};
unsigned char* TextureBMP::getData() { return data; };
int TextureBMP::getWidth() { return width; };
int TextureBMP::getHeight() { return height; };