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
10namespace Util
11{
12class BMP
13{
14public:
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* chardata = new unsigned char[row_padded];
33 for (int j = 0; j < ny; j++)
34 {
35 retcode = fread(chardata, 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)chardata[i+2]; // R
40 (*this)(i/3,j)[1] = (int)chardata[i+1]; // G
41 (*this)(i/3,j)[2] = (int)chardata[i]; // B
42 }
43 }
44 fclose(f);
45 delete[] chardata;
46 }
47 else
48 {
49 Util::Abort(INFO,"File ", filename, " does not exist");
50 }
51 }
52
53 AMREX_FORCE_INLINE
54 std::array<int,3> & operator () (int i,int j)
55 {
56 Util::Assert(INFO,TEST(i < nx)," i = ",i," nx = ", nx);
57 Util::Assert(INFO,TEST(j < ny)," j = ",j," ny = ", ny);
58 return data[nx*j + i];
59 }
60 std::array<int,3> min()
61 {
62 std::array<int,3> _min = {std::numeric_limits<int>::max(), std::numeric_limits<int>::max(), std::numeric_limits<int>::max()};
63 for (unsigned int i = 0; i < data.size(); i++)
64 {
65 if (_min[0] > data[i][0]) _min[0] = data[i][0];
66 if (_min[1] > data[i][1]) _min[1] = data[i][1];
67 if (_min[2] > data[i][2]) _min[2] = data[i][2];
68 }
69 return _min;
70 }
71 std::array<int,3> max()
72 {
73 std::array<int,3> _max = {0, 0, 0};
74 for (unsigned int i = 0; i < data.size(); i++)
75 {
76 if (_max[0] < data[i][0]) _max[0] = data[i][0];
77 if (_max[1] < data[i][1]) _max[1] = data[i][1];
78 if (_max[2] < data[i][2]) _max[2] = data[i][2];
79 }
80 return _max;
81 }
82
83public:
84 int nx, ny;
85private:
86 std::vector<std::array<int,3>> data;
87};
88}
89
90
91#endif
#define TEST(x)
Definition Util.H:21
#define INFO
Definition Util.H:20
std::array< int, 3 > min()
Definition BMP.H:60
BMP()
Definition BMP.H:15
std::vector< std::array< int, 3 > > data
Definition BMP.H:86
void Define(std::string filename)
Definition BMP.H:17
AMREX_FORCE_INLINE std::array< int, 3 > & operator()(int i, int j)
Definition BMP.H:54
std::array< int, 3 > max()
Definition BMP.H:71
int ny
Definition BMP.H:84
int nx
Definition BMP.H:84
A collection of utility routines.
Definition Set.cpp:8
void Abort(const char *msg)
Definition Util.cpp:170
std::string filename
Definition Util.cpp:19
AMREX_FORCE_INLINE void Assert(std::string file, std::string func, int line, std::string smt, bool pass, Args const &... args)
Definition Util.H:70