e8eb202f
David Mayerich
added a new ENVI ...
|
1
2
3
4
|
#ifndef STIM_BIP_H
#define STIM_BIP_H
#include "../envi/envi_header.h"
|
6aa04ba2
David Mayerich
interleave types
|
5
|
#include "../envi/bil.h"
|
88c3e636
heziqi
Ziqi added big.h
|
6
7
8
9
10
11
12
13
14
15
16
17
|
#include "../envi/binary.h"
#include <cstring>
#include <utility>
namespace rts{
template <typename T>
class bip: public binary<T> {
protected:
|
6708cc25
heziqi
Ziqi added envi c...
|
18
19
20
|
std::vector<double> w; //band wavelength
unsigned int offset; //header offset
|
88c3e636
heziqi
Ziqi added big.h
|
21
22
23
24
25
|
public:
using binary<T>::open;
using binary<T>::file;
|
6708cc25
heziqi
Ziqi added envi c...
|
26
|
using binary<T>::R;
|
88c3e636
heziqi
Ziqi added big.h
|
27
28
|
//open a file, given the file and its header's names
|
6708cc25
heziqi
Ziqi added envi c...
|
29
|
bool open(std::string filename, unsigned int X, unsigned int Y, unsigned int B, unsigned int header_offset, std::vector<double> wavelengths){
|
88c3e636
heziqi
Ziqi added big.h
|
30
|
|
6708cc25
heziqi
Ziqi added envi c...
|
31
32
33
34
|
//copy the wavelengths to the BSQ file structure
w = wavelengths;
//copy the offset to the structure
offset = header_offset;
|
88c3e636
heziqi
Ziqi added big.h
|
35
|
|
6708cc25
heziqi
Ziqi added envi c...
|
36
37
38
|
return open(filename, vec<unsigned int>(X, Y, B), header_offset);
return false;
|
88c3e636
heziqi
Ziqi added big.h
|
39
40
41
42
43
44
|
}
//save one band of the file into the memory, and return the pointer
bool band_index( T * p, unsigned int page){
|
6708cc25
heziqi
Ziqi added envi c...
|
45
|
if (page >= R[2]){ //make sure the bank number is right
|
88c3e636
heziqi
Ziqi added big.h
|
46
47
48
49
|
std::cout<<"ERROR: page out of range"<<std::endl;
return false;
}
|
11f177d5
heziqi
Ziqi added functi...
|
50
51
|
//binary::getSlice(p, 0, page); //I met some problems when I called this function?????
file.seekg(page * sizeof(T), std::ios::beg);
|
6708cc25
heziqi
Ziqi added envi c...
|
52
|
for (unsigned i = 0; i < R[0] * R[1]; i++)
|
11f177d5
heziqi
Ziqi added functi...
|
53
54
|
{
file.read((char *)(p + i), sizeof(T));
|
6708cc25
heziqi
Ziqi added envi c...
|
55
|
file.seekg( (R[2] - 1) * sizeof(T), std::ios::cur);
|
11f177d5
heziqi
Ziqi added functi...
|
56
57
|
}
|
88c3e636
heziqi
Ziqi added big.h
|
58
59
60
|
return true;
}
|
e933c14e
David Mayerich
cleaned up the code
|
61
|
bool band( T * p, double wavelength){
|
88c3e636
heziqi
Ziqi added big.h
|
62
|
|
6708cc25
heziqi
Ziqi added envi c...
|
63
|
unsigned int XY = R[0] * R[1]; //calculate the number of pixels in a band
|
88c3e636
heziqi
Ziqi added big.h
|
64
65
66
67
68
69
70
71
|
unsigned page=0; //bands around the wavelength
T * p1;
T * p2;
//get the bands numbers around the wavelength
//if wavelength is smaller than the first one in header file
|
6708cc25
heziqi
Ziqi added envi c...
|
72
|
if ( w[page] > wavelength ){
|
88c3e636
heziqi
Ziqi added big.h
|
73
74
75
76
|
band_index(p, page);
return true;
}
|
6708cc25
heziqi
Ziqi added envi c...
|
77
|
while( w[page] < wavelength )
|
88c3e636
heziqi
Ziqi added big.h
|
78
79
80
|
{
page++;
//if wavelength is larger than the last wavelength in header file
|
6708cc25
heziqi
Ziqi added envi c...
|
81
82
|
if (page == R[2]) {
band_index(p, R[2]-1);
|
88c3e636
heziqi
Ziqi added big.h
|
83
84
85
|
return true;
}
}
|
6708cc25
heziqi
Ziqi added envi c...
|
86
|
if ( wavelength < w[page] )
|
88c3e636
heziqi
Ziqi added big.h
|
87
88
89
90
91
92
|
{
p1=(T*)malloc( XY * sizeof(T)); //memory allocation
p2=(T*)malloc( XY * sizeof(T));
band_index(p1, page - 1);
band_index(p2, page );
for(unsigned i=0; i < XY; i++){
|
6708cc25
heziqi
Ziqi added envi c...
|
93
|
double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]);
|
88c3e636
heziqi
Ziqi added big.h
|
94
95
96
97
98
99
100
101
102
103
104
105
|
p[i] = (p2[i] - p1[i]) * r + p1[i];
}
}
else //if the wavelength is equal to a wavelength in header file
{
band_index(p, page);
}
free(p1);
free(p2);
return true;
}
|
11f177d5
heziqi
Ziqi added functi...
|
106
107
108
|
//get YZ line from the a Y slice, Y slice data should be already IN the MEMORY
bool getYZ(T* p, T* c, double wavelength)
{
|
6708cc25
heziqi
Ziqi added envi c...
|
109
110
|
unsigned int X = R[0]; //calculate the number of pixels in a sample
unsigned int B = R[2];
|
11f177d5
heziqi
Ziqi added functi...
|
111
112
113
114
115
116
117
118
|
unsigned page=0; //samples around the wavelength
T * p1;
T * p2;
//get the bands numbers around the wavelength
//if wavelength is smaller than the first one in header file
|
6708cc25
heziqi
Ziqi added envi c...
|
119
120
|
if ( w[page] > wavelength ){
for(unsigned j = 0; j < R[0]; j++)
|
11f177d5
heziqi
Ziqi added functi...
|
121
122
123
124
125
126
|
{
p[j] = c[j * B];
}
return true;
}
|
6708cc25
heziqi
Ziqi added envi c...
|
127
|
while( w[page] < wavelength )
|
11f177d5
heziqi
Ziqi added functi...
|
128
129
130
131
|
{
page++;
//if wavelength is larger than the last wavelength in header file
if (page == B) {
|
6708cc25
heziqi
Ziqi added envi c...
|
132
|
for(unsigned j = 0; j < R[0]; j++)
|
11f177d5
heziqi
Ziqi added functi...
|
133
134
135
136
137
138
|
{
p[j] = c[(j + 1) * B - 1];
}
return true;
}
}
|
6708cc25
heziqi
Ziqi added envi c...
|
139
|
if ( wavelength < w[page] )
|
11f177d5
heziqi
Ziqi added functi...
|
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
{
p1=(T*)malloc( X * sizeof(T)); //memory allocation
p2=(T*)malloc( X * sizeof(T));
//band_index(p1, page - 1);
for(unsigned j = 0; j < X; j++)
{
p1[j] = c[j * B + page - 1];
}
//band_index(p2, page );
for(unsigned j = 0; j < X; j++)
{
p2[j] = c[j * B + page];
}
for(unsigned i=0; i < X; i++){
|
6708cc25
heziqi
Ziqi added envi c...
|
155
|
double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]);
|
11f177d5
heziqi
Ziqi added functi...
|
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
p[i] = (p2[i] - p1[i]) * r + p1[i];
}
}
else //if the wavelength is equal to a wavelength in header file
{
//band_index(p, page);
for(unsigned j = 0; j < X; j++)
{
p[j] = c[j * B + page];
}
}
return true;
}
//given a y and a wavelength, return the y-band data
//I do not use it right now, to accelerate the processing speed, I try to read a YZ whole slice into memory first, and then we can call "getYZ"
bool get_x_wavelength(T * p, unsigned y, double wavelength)
{
|
6708cc25
heziqi
Ziqi added envi c...
|
174
|
unsigned int X = R[0]; //calculate the number of pixels in a sample
|
11f177d5
heziqi
Ziqi added functi...
|
175
176
177
178
179
180
181
182
|
unsigned page=0; //samples around the wavelength
T * p1;
T * p2;
//get the bands numbers around the wavelength
//if wavelength is smaller than the first one in header file
|
6708cc25
heziqi
Ziqi added envi c...
|
183
184
185
|
if ( w[page] > wavelength ){
file.seekg( y * R[2] * R[0] * sizeof(T), std::ios::beg);
for(unsigned j = 0; j < R[0]; j++)
|
11f177d5
heziqi
Ziqi added functi...
|
186
187
|
{
file.read((char *)(p + j), sizeof(T));
|
6708cc25
heziqi
Ziqi added envi c...
|
188
|
file.seekg((R[2] - 1) * sizeof(T), std::ios::cur);
|
11f177d5
heziqi
Ziqi added functi...
|
189
190
191
192
|
}
return true;
}
|
6708cc25
heziqi
Ziqi added envi c...
|
193
|
while( w[page] < wavelength )
|
11f177d5
heziqi
Ziqi added functi...
|
194
195
196
|
{
page++;
//if wavelength is larger than the last wavelength in header file
|
6708cc25
heziqi
Ziqi added envi c...
|
197
198
199
|
if (page == R[2]) {
file.seekg( (y * R[2] * R[0] + R[2] - 1)* sizeof(T), std::ios::beg);
for(unsigned j = 0; j < R[0]; j++)
|
11f177d5
heziqi
Ziqi added functi...
|
200
201
|
{
file.read((char *)(p + j), sizeof(T));
|
6708cc25
heziqi
Ziqi added envi c...
|
202
|
file.seekg((R[2] - 1) * sizeof(T), std::ios::cur);
|
11f177d5
heziqi
Ziqi added functi...
|
203
204
205
206
|
}
return true;
}
}
|
6708cc25
heziqi
Ziqi added envi c...
|
207
|
if ( wavelength < w[page] )
|
11f177d5
heziqi
Ziqi added functi...
|
208
209
210
211
|
{
p1=(T*)malloc( X * sizeof(T)); //memory allocation
p2=(T*)malloc( X * sizeof(T));
//band_index(p1, page - 1);
|
6708cc25
heziqi
Ziqi added envi c...
|
212
213
|
file.seekg( (y * R[2] * R[0] + page - 1)* sizeof(T), std::ios::beg);
for(unsigned j = 0; j < R[0]; j++)
|
11f177d5
heziqi
Ziqi added functi...
|
214
215
|
{
file.read((char *)(p1 + j), sizeof(T));
|
6708cc25
heziqi
Ziqi added envi c...
|
216
|
file.seekg((R[2] - 1) * sizeof(T), std::ios::cur);
|
11f177d5
heziqi
Ziqi added functi...
|
217
218
|
}
//band_index(p2, page );
|
6708cc25
heziqi
Ziqi added envi c...
|
219
220
|
file.seekg( (y * R[2] * R[0] + page)* sizeof(T), std::ios::beg);
for(unsigned j = 0; j < R[0]; j++)
|
11f177d5
heziqi
Ziqi added functi...
|
221
222
|
{
file.read((char *)(p2 + j), sizeof(T));
|
6708cc25
heziqi
Ziqi added envi c...
|
223
|
file.seekg((R[2] - 1) * sizeof(T), std::ios::cur);
|
11f177d5
heziqi
Ziqi added functi...
|
224
225
|
}
|
6708cc25
heziqi
Ziqi added envi c...
|
226
227
|
for(unsigned i=0; i < R[0]; i++){
double r = (double) (wavelength - w[page-1]) / (double) (w[page] - w[page-1]);
|
11f177d5
heziqi
Ziqi added functi...
|
228
229
230
231
232
233
|
p[i] = (p2[i] - p1[i]) * r + p1[i];
}
}
else //if the wavelength is equal to a wavelength in header file
{
//band_index(p, page);
|
6708cc25
heziqi
Ziqi added envi c...
|
234
235
|
file.seekg( (y * R[2] * R[0] + page) * sizeof(T), std::ios::beg);
for(unsigned j = 0; j < R[0]; j++)
|
11f177d5
heziqi
Ziqi added functi...
|
236
237
|
{
file.read((char *)(p + j), sizeof(T));
|
6708cc25
heziqi
Ziqi added envi c...
|
238
|
file.seekg((R[2] - 1) * sizeof(T), std::ios::cur);
|
11f177d5
heziqi
Ziqi added functi...
|
239
240
|
}
}
|
11f177d5
heziqi
Ziqi added functi...
|
241
242
|
return true;
}
|
88c3e636
heziqi
Ziqi added big.h
|
243
244
|
//save one pixel of the BIP file into the memory, and return the pointer
|
e933c14e
David Mayerich
cleaned up the code
|
245
|
bool spectrum(T * p, unsigned x, unsigned y){
|
88c3e636
heziqi
Ziqi added big.h
|
246
|
|
6708cc25
heziqi
Ziqi added envi c...
|
247
|
if ( x >= R[0] || y >= R[1]){ //make sure the sample and line number is right
|
88c3e636
heziqi
Ziqi added big.h
|
248
|
std::cout<<"ERROR: sample or line out of range"<<std::endl;
|
11f177d5
heziqi
Ziqi added functi...
|
249
|
exit(1);
|
88c3e636
heziqi
Ziqi added big.h
|
250
251
|
}
|
6708cc25
heziqi
Ziqi added envi c...
|
252
|
file.seekg((x + y * R[0]) * R[2] * sizeof(T), std::ios::beg); //point to the certain sample and line
|
88c3e636
heziqi
Ziqi added big.h
|
253
|
|
6708cc25
heziqi
Ziqi added envi c...
|
254
|
file.read((char *)p, sizeof(T) * R[2]);
|
88c3e636
heziqi
Ziqi added big.h
|
255
256
257
|
return true;
}
|
11f177d5
heziqi
Ziqi added functi...
|
258
259
260
|
//given a Y ,return a ZX slice
bool getY(T * p, unsigned y)
|
88c3e636
heziqi
Ziqi added big.h
|
261
|
{
|
6708cc25
heziqi
Ziqi added envi c...
|
262
|
if ( y >= R[1]){ //make sure the line number is right
|
11f177d5
heziqi
Ziqi added functi...
|
263
264
265
266
|
std::cout<<"ERROR: line out of range"<<std::endl;
exit(1);
}
|
6708cc25
heziqi
Ziqi added envi c...
|
267
268
|
file.seekg(y * R[2] * R[0] * sizeof(T), std::ios::beg);
file.read((char *)p, sizeof(T) * R[2] * R[0]);
|
11f177d5
heziqi
Ziqi added functi...
|
269
270
271
272
273
274
|
return true;
}
//(BIP) baseline correction
|
11f177d5
heziqi
Ziqi added functi...
|
275
276
|
bool baseline(std::string outname, std::vector<double> wls){
|
88c3e636
heziqi
Ziqi added big.h
|
277
278
279
280
281
282
|
unsigned N = wls.size(); //get the number of baseline points
std::ofstream target(outname.c_str(), std::ios::binary); //open the target binary file
std::string headername = outname + ".hdr"; //the header file name
//simplify image resolution
|
6708cc25
heziqi
Ziqi added envi c...
|
283
|
unsigned int ZX = R[2] * R[0]; //calculate the number of points in a Y slice
|
11f177d5
heziqi
Ziqi added functi...
|
284
|
unsigned int L = ZX * sizeof(T); //calculate the number of bytes of a Y slice
|
6708cc25
heziqi
Ziqi added envi c...
|
285
286
|
unsigned int B = R[2];
unsigned int X = R[0];
|
88c3e636
heziqi
Ziqi added big.h
|
287
|
|
11f177d5
heziqi
Ziqi added functi...
|
288
289
|
T* c; //pointer to the current Y slice
c = (T*)malloc(L); //memory allocation
|
88c3e636
heziqi
Ziqi added big.h
|
290
|
|
11f177d5
heziqi
Ziqi added functi...
|
291
292
|
T* a; //pointer to the two YZ lines surrounding the current YZ line
T* b;
|
88c3e636
heziqi
Ziqi added big.h
|
293
|
|
11f177d5
heziqi
Ziqi added functi...
|
294
295
|
a = (T*)malloc(X * sizeof(T));
b = (T*)malloc(X * sizeof(T));
|
88c3e636
heziqi
Ziqi added big.h
|
296
|
|
88c3e636
heziqi
Ziqi added big.h
|
297
298
299
|
double ai, bi; //stores the two baseline points wavelength surrounding the current band
double ci; //stores the current band's wavelength
|
f6169dea
heziqi
Ziqi completed bi...
|
300
|
unsigned control;
|
88c3e636
heziqi
Ziqi added big.h
|
301
|
|
88c3e636
heziqi
Ziqi added big.h
|
302
303
304
305
|
if (a == NULL || b == NULL || c == NULL){
std::cout<<"ERROR: error allocating memory";
exit(1);
}
|
11f177d5
heziqi
Ziqi added functi...
|
306
307
|
// loop start correct every y slice
|
6708cc25
heziqi
Ziqi added envi c...
|
308
|
for (unsigned k =0; k < R[1]; k++)
|
11f177d5
heziqi
Ziqi added functi...
|
309
310
311
312
313
|
{
//get the current y slice
getY(c, k);
//initialize lownum, highnum, low, high
|
f6169dea
heziqi
Ziqi completed bi...
|
314
|
control=0;
|
6708cc25
heziqi
Ziqi added envi c...
|
315
|
ai = w[0];
|
11f177d5
heziqi
Ziqi added functi...
|
316
|
//if no baseline point is specified at band 0,
|
88c3e636
heziqi
Ziqi added big.h
|
317
|
//set the baseline point at band 0 to 0
|
6708cc25
heziqi
Ziqi added envi c...
|
318
|
if(wls[0] != w[0]){
|
11f177d5
heziqi
Ziqi added functi...
|
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
|
bi = wls[control];
memset(a, (char)0, X * sizeof(T) );
}
//else get the low band
else{
control++;
getYZ(a, c, ai);
bi = wls[control];
}
//get the high band
getYZ(b, c, bi);
//correct every YZ line
for(unsigned cii = 0; cii < B; cii++){
|
11f177d5
heziqi
Ziqi added functi...
|
334
|
//update baseline points, if necessary
|
6708cc25
heziqi
Ziqi added envi c...
|
335
|
if( w[cii] >= bi && cii != B - 1) {
|
11f177d5
heziqi
Ziqi added functi...
|
336
337
338
339
340
341
342
343
344
345
346
347
348
|
//if the high band is now on the last BL point?
if (control != N-1) {
control++; //increment the index
std::swap(a, b); //swap the baseline band pointers
ai = bi;
bi = wls[control];
getYZ(b, c, bi);
}
//if the last BL point on the last band of the file?
|
6708cc25
heziqi
Ziqi added envi c...
|
349
|
else if ( wls[control] < w[B - 1]) {
|
11f177d5
heziqi
Ziqi added functi...
|
350
351
352
353
354
355
|
std::swap(a, b); //swap the baseline band pointers
memset(b, (char)0, X * sizeof(T) ); //clear the high band
ai = bi;
|
6708cc25
heziqi
Ziqi added envi c...
|
356
|
bi = w[B - 1];
|
11f177d5
heziqi
Ziqi added functi...
|
357
|
}
|
88c3e636
heziqi
Ziqi added big.h
|
358
|
}
|
88c3e636
heziqi
Ziqi added big.h
|
359
|
|
6708cc25
heziqi
Ziqi added envi c...
|
360
|
ci = w[cii];
|
11f177d5
heziqi
Ziqi added functi...
|
361
362
363
364
365
|
//perform the baseline correction
for(unsigned i=0; i < X; i++)
{
double r = (double) (ci - ai) / (double) (bi - ai);
|
92e4cf05
heziqi
include file fixed
|
366
|
c[i * B + cii] =(T) ( c[i * B + cii] - (b[i] - a[i]) * r - a[i] );
|
11f177d5
heziqi
Ziqi added functi...
|
367
368
369
|
}
}//loop for YZ line end
|
11f177d5
heziqi
Ziqi added functi...
|
370
371
|
target.write(reinterpret_cast<const char*>(c), L); //write the corrected data into destination
}//loop for Y slice end
|
88c3e636
heziqi
Ziqi added big.h
|
372
|
|
6708cc25
heziqi
Ziqi added envi c...
|
373
|
|
88c3e636
heziqi
Ziqi added big.h
|
374
375
376
377
378
|
free(a);
free(b);
free(c);
target.close();
|
11f177d5
heziqi
Ziqi added functi...
|
379
380
|
return true;
|
88c3e636
heziqi
Ziqi added big.h
|
381
|
}
|
11f177d5
heziqi
Ziqi added functi...
|
382
383
|
// normalize the BIP file
|
e933c14e
David Mayerich
cleaned up the code
|
384
|
bool normalize(std::string outname, double w)
|
88c3e636
heziqi
Ziqi added big.h
|
385
|
{
|
6708cc25
heziqi
Ziqi added envi c...
|
386
387
388
389
390
|
unsigned int B = R[2]; //calculate the number of bands
unsigned int Y = R[1];
unsigned int X = R[0];
unsigned int ZX = R[2] * R[0];
unsigned int XY = R[0] * R[1]; //calculate the number of pixels in a band
|
11f177d5
heziqi
Ziqi added functi...
|
391
392
|
unsigned int S = XY * sizeof(T); //calculate the number of bytes in a band
unsigned int L = ZX * sizeof(T);
|
88c3e636
heziqi
Ziqi added big.h
|
393
394
395
396
|
std::ofstream target(outname.c_str(), std::ios::binary); //open the target binary file
std::string headername = outname + ".hdr"; //the header file name
|
11f177d5
heziqi
Ziqi added functi...
|
397
398
|
T * c; //pointer to the current ZX slice
T * b; //pointer to the standard band
|
88c3e636
heziqi
Ziqi added big.h
|
399
400
|
b = (T*)malloc( S ); //memory allocation
|
11f177d5
heziqi
Ziqi added functi...
|
401
|
c = (T*)malloc( L );
|
88c3e636
heziqi
Ziqi added big.h
|
402
|
|
e933c14e
David Mayerich
cleaned up the code
|
403
|
band(b, w); //get the certain band into memory
|
88c3e636
heziqi
Ziqi added big.h
|
404
|
|
11f177d5
heziqi
Ziqi added functi...
|
405
|
for(unsigned j = 0; j < Y; j++)
|
88c3e636
heziqi
Ziqi added big.h
|
406
|
{
|
11f177d5
heziqi
Ziqi added functi...
|
407
|
getY(c, j);
|
f6169dea
heziqi
Ziqi completed bi...
|
408
|
unsigned jX = j * X; //to avoid calculating it many times
|
11f177d5
heziqi
Ziqi added functi...
|
409
|
for(unsigned i = 0; i < X; i++)
|
88c3e636
heziqi
Ziqi added big.h
|
410
|
{
|
f6169dea
heziqi
Ziqi completed bi...
|
411
|
unsigned iB = i * B;
|
11f177d5
heziqi
Ziqi added functi...
|
412
413
|
for(unsigned m = 0; m < B; m++)
{
|
f6169dea
heziqi
Ziqi completed bi...
|
414
|
c[m + iB] = c[m + iB] / b[i + jX]; //perform normalization
|
11f177d5
heziqi
Ziqi added functi...
|
415
|
}
|
88c3e636
heziqi
Ziqi added big.h
|
416
|
}
|
11f177d5
heziqi
Ziqi added functi...
|
417
|
target.write(reinterpret_cast<const char*>(c), L); //write normalized data into destination
|
88c3e636
heziqi
Ziqi added big.h
|
418
|
}
|
6708cc25
heziqi
Ziqi added envi c...
|
419
|
|
88c3e636
heziqi
Ziqi added big.h
|
420
421
422
423
424
425
426
|
free(b);
free(c);
target.close();
return true;
}
|
11f177d5
heziqi
Ziqi added functi...
|
427
428
|
//convert BIP file to BSQ file and save it
bool bsq(std::string outname)
|
f6169dea
heziqi
Ziqi completed bi...
|
429
430
431
432
433
434
435
|
{
std::string temp = outname + "_temp";
std::string headtemp = temp + ".hdr";
//first creat a temporary bil file and convert bip file to bil file
bil(temp);
rts::bil<T> n;
|
e933c14e
David Mayerich
cleaned up the code
|
436
|
if(n.open(temp, R[0], R[1], R[2], offset, w)==false){ //open infile
|
f6169dea
heziqi
Ziqi completed bi...
|
437
438
439
440
441
442
443
444
445
446
447
448
449
|
std::cout<<"ERROR: unable to open input file"<<std::endl;
exit(1);
}
//then convert bil file to bsq file
n.bsq(outname);
n.close();
remove(temp.c_str());
remove(headtemp.c_str());
return true;
}
//convert bip file to bil file and save it
bool bil(std::string outname)
|
11f177d5
heziqi
Ziqi added functi...
|
450
|
{
|
6708cc25
heziqi
Ziqi added envi c...
|
451
|
unsigned int S = R[0] * R[2] * sizeof(T); //calculate the number of bytes in a ZX slice
|
11f177d5
heziqi
Ziqi added functi...
|
452
453
454
455
|
std::ofstream target(outname.c_str(), std::ios::binary);
std::string headername = outname + ".hdr";
|
f6169dea
heziqi
Ziqi completed bi...
|
456
|
T * p; //pointer to the current ZX slice for bip file
|
11f177d5
heziqi
Ziqi added functi...
|
457
|
p = (T*)malloc(S);
|
f6169dea
heziqi
Ziqi completed bi...
|
458
459
|
T * q; //pointer to the current XZ slice for bil file
q = (T*)malloc(S);
|
11f177d5
heziqi
Ziqi added functi...
|
460
|
|
6708cc25
heziqi
Ziqi added envi c...
|
461
|
for ( unsigned i = 0; i < R[1]; i++)
|
11f177d5
heziqi
Ziqi added functi...
|
462
|
{
|
f6169dea
heziqi
Ziqi completed bi...
|
463
|
getY(p, i);
|
6708cc25
heziqi
Ziqi added envi c...
|
464
|
for ( unsigned k = 0; k < R[2]; k++)
|
f6169dea
heziqi
Ziqi completed bi...
|
465
|
{
|
6708cc25
heziqi
Ziqi added envi c...
|
466
467
468
|
unsigned ks = k * R[0];
for ( unsigned j = 0; j < R[0]; j++)
q[ks + j] = p[k + j * R[2]];
|
f6169dea
heziqi
Ziqi completed bi...
|
469
470
|
}
target.write(reinterpret_cast<const char*>(q), S); //write a band data into target file
|
11f177d5
heziqi
Ziqi added functi...
|
471
|
}
|
f6169dea
heziqi
Ziqi completed bi...
|
472
|
|
11f177d5
heziqi
Ziqi added functi...
|
473
474
|
free(p);
|
f6169dea
heziqi
Ziqi completed bi...
|
475
|
free(q);
|
11f177d5
heziqi
Ziqi added functi...
|
476
477
478
|
target.close();
return true;
}
|
88c3e636
heziqi
Ziqi added big.h
|
479
|
|
f6169dea
heziqi
Ziqi completed bi...
|
480
481
482
483
484
485
|
//close the file
bool close(){
file.close();
return true;
}
|
88c3e636
heziqi
Ziqi added big.h
|
486
|
};
|
6aa04ba2
David Mayerich
interleave types
|
487
|
}
|
e8eb202f
David Mayerich
added a new ENVI ...
|
488
489
|
#endif
|