Alamo
BMP.H
Go to the documentation of this file.
1 #ifndef UTIL_BMP_H
2 #define UTIL_BMP_H
3 
4 #include <string>
5 #include <iostream>
6 #include <vector>
7 #include <array>
8 #include "Util/Util.H"
9 
10 namespace Util
11 {
12 class BMP
13 {
14 public:
15  BMP () {};
16 
17  void Define (std::string filename)
18  {
19  FILE* f;
20  int retcode = -1;
21  if ((f = fopen(filename.c_str(), "rb")))
22  {
23  unsigned char info[54];
24  retcode = fread(info, sizeof(unsigned char), 54, f);
25  if (retcode != 54) Util::Abort(INFO,"Error reading BMP file: 54 bytes expected but only ", retcode, " read.");
26  nx = *(int*)&info[18];
27  ny = *(int*)&info[22];
28 
29  data.resize(nx*ny);
30 
31  int row_padded = (nx*3 + 3) & (~3);
32  unsigned char* data = new unsigned char[row_padded];
33  for (int j = 0; j < ny; j++)
34  {
35  retcode = fread(data, sizeof(unsigned char), row_padded, f);
36  if (retcode != row_padded) Util::Abort(INFO,"Error reading BMP file: ",row_padded," bytes expected but only ", retcode, " read.");
37  for(int i = 0; i < nx*3; i += 3)
38  {
39  (*this)(i/3,j)[0] = (int)data[i+2]; // R
40  (*this)(i/3,j)[1] = (int)data[i+1]; // G
41  (*this)(i/3,j)[2] = (int)data[i]; // B
42  }
43  }
44  fclose(f);
45  }
46  else
47  {
48  Util::Abort(INFO,"File ", filename, " does not exist");
49  }
50  }
51 
52  AMREX_FORCE_INLINE
53  std::array<int,3> & operator () (int i,int j)
54  {
55  Util::Assert(INFO,TEST(i < nx)," i = ",i," nx = ", nx);
56  Util::Assert(INFO,TEST(j < ny)," j = ",j," ny = ", ny);
57  return data[nx*j + i];
58  }
59  std::array<int,3> min()
60  {
61  std::array<int,3> _min = {std::numeric_limits<int>::max(), std::numeric_limits<int>::max(), std::numeric_limits<int>::max()};
62  for (unsigned int i = 0; i < data.size(); i++)
63  {
64  if (_min[0] > data[i][0]) _min[0] = data[i][0];
65  if (_min[1] > data[i][1]) _min[1] = data[i][1];
66  if (_min[2] > data[i][2]) _min[2] = data[i][2];
67  }
68  return _min;
69  }
70  std::array<int,3> max()
71  {
72  std::array<int,3> _max = {0, 0, 0};
73  for (unsigned int i = 0; i < data.size(); i++)
74  {
75  if (_max[0] < data[i][0]) _max[0] = data[i][0];
76  if (_max[1] < data[i][1]) _max[1] = data[i][1];
77  if (_max[2] < data[i][2]) _max[2] = data[i][2];
78  }
79  return _max;
80  }
81 
82 public:
83  int nx, ny;
84 private:
85  std::vector<std::array<int,3>> data;
86 };
87 }
88 
89 
90 #endif
Util::filename
std::string filename
Definition: Util.cpp:19
Util.H
TEST
#define TEST(x)
Definition: Util.H:21
Util::BMP::ny
int ny
Definition: BMP.H:83
Util::BMP::BMP
BMP()
Definition: BMP.H:15
Util
A collection of utility routines.
Definition: Set.cpp:7
Util::Assert
AMREX_FORCE_INLINE void Assert(std::string file, std::string func, int line, std::string smt, bool pass, Args const &... args)
Definition: Util.H:65
Util::BMP::min
std::array< int, 3 > min()
Definition: BMP.H:59
Util::Abort
void Abort(const char *msg)
Definition: Util.cpp:165
Util::BMP::nx
int nx
Definition: BMP.H:83
Util::BMP::operator()
AMREX_FORCE_INLINE std::array< int, 3 > & operator()(int i, int j)
Definition: BMP.H:53
Util::BMP::max
std::array< int, 3 > max()
Definition: BMP.H:70
Util::BMP::Define
void Define(std::string filename)
Definition: BMP.H:17
Util::BMP
Definition: BMP.H:12
Util::BMP::data
std::vector< std::array< int, 3 > > data
Definition: BMP.H:85
INFO
#define INFO
Definition: Util.H:20