Blame view

envi/bip.h 12.5 KB
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