16 #include <geo_normalize.h> 18 #include <geovalues.h> 21 static ossimTrace traceDebug(
"ossim::TiffHandlerState");
26 const ossimString ossim::TiffHandlerState::m_typeName =
"ossim::TiffHandlerState";
28 ossim::TiffHandlerState::TiffHandlerState()
33 ossim::TiffHandlerState::~TiffHandlerState()
38 const ossimString& ossim::TiffHandlerState::getTypeName()
const 43 const ossimString& ossim::TiffHandlerState::getStaticTypeName()
48 void ossim::TiffHandlerState::addValue(
const ossimString& key,
54 bool ossim::TiffHandlerState::getValue(
ossimString& value,
58 return getValue(value,
62 bool ossim::TiffHandlerState::getValue(
ossimString& value,
67 const char* v = m_tags.find(key.
c_str());
84 bool ossim::TiffHandlerState::exists(
const ossimString& key)
const 86 return (m_tags.find(key)!= 0);
95 bool ossim::TiffHandlerState::checkBool(
const ossimString& key)
const 98 const char* value = m_tags.
find(key);
106 bool ossim::TiffHandlerState::loadDefaults(
const ossimFilename& file,
109 bool result = ImageHandlerState::loadDefaults(file, entry);
116 std::shared_ptr<ossim::TiffIStreamAdaptor> streamAdaptor = std::make_shared<ossim::TiffIStreamAdaptor>(tiffStream,
118 TIFF* tiffPtr = XTIFFClientOpen(file.
c_str(),
"rm",
119 (thandle_t)streamAdaptor.get(),
120 ossim::TiffIStreamAdaptor::tiffRead,
121 ossim::TiffIStreamAdaptor::tiffWrite,
122 ossim::TiffIStreamAdaptor::tiffSeek,
123 ossim::TiffIStreamAdaptor::tiffClose,
124 ossim::TiffIStreamAdaptor::tiffSize,
125 ossim::TiffIStreamAdaptor::tiffMap,
126 ossim::TiffIStreamAdaptor::tiffUnmap);
130 loadDefaults(tiffPtr);
141 void ossim::TiffHandlerState::loadDefaults(
TIFF* tiffPtr)
143 ossim_int64 currentDirectory = TIFFCurrentDirectory(tiffPtr);
144 TIFFSetDirectory(tiffPtr, 0);
145 ossim_int32 numberOfDirectories = TIFFNumberOfDirectories(tiffPtr);
150 for(;idx < numberOfDirectories;++idx)
152 if (!TIFFSetDirectory(tiffPtr, idx))
158 loadDirectory(tiffPtr, idx);
161 TIFFSetDirectory(tiffPtr, currentDirectory);
165 void ossim::TiffHandlerState::loadCurrentDirectory(
TIFF* tiffPtr)
169 loadDirectory(tiffPtr, TIFFCurrentDirectory(tiffPtr));
173 void ossim::TiffHandlerState::loadDirectory(
TIFF* tiffPtr,
193 ossim_int32 numberOfDirectories = TIFFNumberOfDirectories(tiffPtr);
197 if(TIFFCurrentDirectory(tiffPtr) != directory)
199 if(!TIFFSetDirectory(tiffPtr, directory))
206 if(TIFFGetField(tiffPtr, TIFFTAG_COMPRESSION, &compressionType))
211 if( TIFFGetField(tiffPtr, TIFFTAG_BITSPERSAMPLE, &bitsPerSample) )
215 if( TIFFGetField(tiffPtr,
216 TIFFTAG_SAMPLESPERPIXEL,
222 if ( TIFFGetField( tiffPtr,
223 TIFFTAG_SAMPLEFORMAT,
224 &sampleFormatUnit ) )
229 if (TIFFGetField(tiffPtr,
230 TIFFTAG_SMAXSAMPLEVALUE,
237 if(TIFFGetField( tiffPtr,
238 TIFFTAG_MAXSAMPLEVALUE,
246 if ( TIFFGetField( tiffPtr,
247 TIFFTAG_SMINSAMPLEVALUE,
254 if(TIFFGetField( tiffPtr,
255 TIFFTAG_MINSAMPLEVALUE,
264 if ( TIFFGetField( tiffPtr,
268 addValue(dirPrefix+
"tifftag.image_length",
273 if ( TIFFGetField( tiffPtr,
277 addValue(dirPrefix+
"tifftag.image_width",
281 if (TIFFGetField(tiffPtr,
282 TIFFTAG_SUBFILETYPE ,
288 if( TIFFGetField( tiffPtr, TIFFTAG_PLANARCONFIG,
291 addValue(dirPrefix+
"tifftag.planar_config",
295 if( TIFFGetField( tiffPtr, TIFFTAG_PHOTOMETRIC,
298 addValue(dirPrefix+
"tifftag.photometric",
306 if(TIFFGetField(tiffPtr, TIFFTAG_COLORMAP, &red, &green, &blue))
310 saveColorMap(dirPrefix, red, green, blue, 1<<bitsPerSample);
314 if( TIFFIsTiled(tiffPtr))
316 addValue(dirPrefix+
"is_tiled",
"true");
317 if ( TIFFGetField( tiffPtr,
321 addValue(dirPrefix+
"tifftag.tile_width",
324 if ( TIFFGetField( tiffPtr,
328 addValue(dirPrefix+
"tifftag.tile_length",
334 addValue(dirPrefix+
"tiff_is_tiled",
"false");
335 if( TIFFGetField( tiffPtr, TIFFTAG_ROWSPERSTRIP,
338 addValue(dirPrefix+
"tifftag.rows_per_strip",
343 loadGeotiffTags(tiffPtr, dirPrefix);
347 void ossim::TiffHandlerState::saveColorMap(
const ossimString& dirPrefix,
360 for(;idx < (numberOfEntries-1);++idx,++red,++green,++blue)
362 redStream << *red <<
",";
363 greenStream << *green <<
",";
364 blueStream << *blue <<
",";
372 redStream << *red <<
")";
373 greenStream << *green <<
")";
374 blueStream << *blue <<
")";
376 addValue(dirPrefix+
"tifftag.colormap.red",
378 addValue(dirPrefix+
"tifftag.colormap.green",
380 addValue(dirPrefix+
"tifftag.colormap.blue",
384 void ossim::TiffHandlerState::loadGeotiffTags(
TIFF* tiffPtr,
387 const int CITATION_STRING_SIZE = 512;
392 GTIF* gtif = GTIFNew(tiffPtr);
393 char citationStrPtr[CITATION_STRING_SIZE];
396 double tempDouble=0.0;
397 double* doubleArray=0;
399 bool loadedGeotiff =
false;
402 addValue(dirPrefix+
"is_geotiff",
"false");
413 if(GTIFKeyGet(gtif, GTModelTypeGeoKey, &tempUint16, 0, 1))
415 loadedGeotiff =
true;
416 addValue(dirPrefix+
"tifftag.model_type",
419 if(GTIFKeyGet(gtif, GeographicTypeGeoKey, &tempUint16, 0, 1))
421 loadedGeotiff =
true;
422 addValue(dirPrefix+
"tifftag.gcs_code",
425 if(GTIFKeyGet(gtif, GeogGeodeticDatumGeoKey, &tempUint16, 0, 1))
427 loadedGeotiff =
true;
428 addValue(dirPrefix+
"tifftag.datum_code",
431 if(GTIFKeyGet(gtif, GeogAngularUnitsGeoKey, &tempUint16, 0, 1))
433 loadedGeotiff =
true;
434 addValue(dirPrefix+
"tifftag.angular_units",
437 if(GTIFKeyGet(gtif, GeogLinearUnitsGeoKey, &tempUint16, 0, 1))
439 loadedGeotiff =
true;
440 addValue(dirPrefix+
"tifftag.linear_units",
444 if(GTIFKeyGet(gtif, ProjStdParallel1GeoKey, &tempDouble, 0, 1))
446 loadedGeotiff =
true;
447 addValue(dirPrefix+
"tifftag.std_parallel_1",
450 if(GTIFKeyGet(gtif, ProjStdParallel2GeoKey, &tempDouble, 0, 1))
452 loadedGeotiff =
true;
453 addValue(dirPrefix+
"tifftag.std_parallel_2",
456 if(GTIFKeyGet(gtif, ProjNatOriginLongGeoKey, &tempDouble, 0, 1))
458 loadedGeotiff =
true;
459 addValue(dirPrefix+
"tifftag.origin_lon",
462 else if(GTIFKeyGet(gtif, ProjOriginLongGeoKey, &tempDouble, 0, 1))
464 loadedGeotiff =
true;
465 addValue(dirPrefix+
"tifftag.origin_lon",
468 if(GTIFKeyGet(gtif, ProjNatOriginLatGeoKey, &tempDouble, 0, 1))
470 loadedGeotiff =
true;
471 addValue(dirPrefix+
"tifftag.origin_lat",
474 else if(GTIFKeyGet(gtif, ProjOriginLatGeoKey, &tempDouble, 0, 1))
476 loadedGeotiff =
true;
477 addValue(dirPrefix+
"tifftag.origin_lat",
480 if(GTIFKeyGet(gtif, ProjFalseEastingGeoKey, &tempDouble, 0, 1))
482 loadedGeotiff =
true;
483 addValue(dirPrefix+
"tifftag.false_easting",
486 if(GTIFKeyGet(gtif, ProjFalseNorthingGeoKey, &tempDouble, 0, 1))
488 loadedGeotiff =
true;
489 addValue(dirPrefix+
"tifftag.false_northing",
492 if(GTIFKeyGet(gtif, ProjCenterLongGeoKey, &tempDouble, 0, 1))
494 loadedGeotiff =
true;
495 addValue(dirPrefix+
"tifftag.center_lon",
498 if(GTIFKeyGet(gtif, ProjCenterLatGeoKey, &tempDouble, 0, 1))
500 loadedGeotiff =
true;
501 addValue(dirPrefix+
"tifftag.center_lat",
504 if(GTIFKeyGet(gtif, ProjScaleAtNatOriginGeoKey, &tempDouble, 0, 1))
506 loadedGeotiff =
true;
507 addValue(dirPrefix+
"tifftag.scale_factor",
510 if(GTIFKeyGet(gtif, GTRasterTypeGeoKey, &rasterType, 0, 1))
512 loadedGeotiff =
true;
513 addValue(dirPrefix+
"tifftag.raster_type",
517 if (GTIFKeyGet(gtif, ProjectedCSTypeGeoKey, &pcsCode, 0, 1))
519 loadedGeotiff =
true;
520 addValue(dirPrefix+
"tifftag.pcs_code",
524 if ( GTIFKeyGet(gtif, GTCitationGeoKey, &citationStrPtr ,
525 0, CITATION_STRING_SIZE))
527 loadedGeotiff =
true;
528 addValue(dirPrefix+
"tifftag.citation",
531 if(GTIFKeyGet(gtif, PCSCitationGeoKey , &buf, 0, 1))
533 loadedGeotiff =
true;
534 addValue(dirPrefix+
"tifftag.pcs_citation",
537 if(GTIFKeyGet(gtif, ProjCoordTransGeoKey , &coordTransGeoCode, 0, 1))
539 loadedGeotiff =
true;
540 addValue(dirPrefix+
"tifftag.coord_trans_code",
544 if(TIFFGetField(tiffPtr, TIFFTAG_GEOPIXELSCALE, &doubleArraySize, &doubleArray))
546 loadedGeotiff =
true;
547 convertArrayToStringList(doubleArrayStr, doubleArray, doubleArraySize);
548 if(!doubleArrayStr.
empty())
550 addValue(dirPrefix+
"tifftag.geo_pixel_scale", doubleArrayStr);
553 if(TIFFGetField(tiffPtr, TIFFTAG_GEOTIEPOINTS, &doubleArraySize, &doubleArray))
555 loadedGeotiff =
true;
556 convertArrayToStringList(doubleArrayStr, doubleArray, doubleArraySize);
557 if(!doubleArrayStr.
empty())
559 addValue(dirPrefix+
"tifftag.geo_tie_points", doubleArrayStr);
562 if(TIFFGetField(tiffPtr, TIFFTAG_GEODOUBLEPARAMS, &doubleArraySize, &doubleArray))
564 loadedGeotiff =
true;
565 convertArrayToStringList(doubleArrayStr, doubleArray, doubleArraySize);
566 if(!doubleArrayStr.
empty())
568 addValue(dirPrefix+
"tifftag.geo_double_params", doubleArrayStr);
571 if(TIFFGetField(tiffPtr, TIFFTAG_GEOTRANSMATRIX, &doubleArraySize, &doubleArray))
573 loadedGeotiff =
true;
574 convertArrayToStringList(doubleArrayStr, doubleArray, doubleArraySize);
575 if(!doubleArrayStr.
empty())
577 addValue(dirPrefix+
"tifftag.geo_trans_matrix", doubleArrayStr);
580 if(TIFFGetField(tiffPtr, TIFFTAG_GEOASCIIPARAMS, &buf))
582 loadedGeotiff =
true;
583 addValue(dirPrefix+
"tifftag.geo_ascii_params", buf);
589 bool ossim::TiffHandlerState::isReduced(
ossim_uint32 directory)
const 591 return getInt32Value(
"tifftag.sub_file_type", directory)&FILETYPE_REDUCEDIMAGE;
594 bool ossim::TiffHandlerState::isMask(
ossim_uint32 directory)
const 596 return getInt32Value(
"tifftag.sub_file_type", directory)&FILETYPE_MASK;
599 bool ossim::TiffHandlerState::isPage(
ossim_uint32 directory)
const 601 return getInt32Value(
"tifftag.sub_file_type", directory)&FILETYPE_PAGE;
604 bool ossim::TiffHandlerState::isTiled(
ossim_uint32 directory)
const 606 return checkBool(directory,
"is_tiled");
609 void ossim::TiffHandlerState::convertArrayToStringList(
ossimString& result,
double* doubleArray,
ossim_int32 doubleArraySize)
const 613 if(doubleArray && (doubleArraySize > 0))
617 doubleArrayStream <<
"(";
618 for(idx = 0; idx < doubleArraySize-1;++idx)
623 result = doubleArrayStream.str();
629 return getInt32Value(
"tifftag.model_type", directory);
634 return getInt32Value(
"tifftag.angular_units", directory);
639 return getInt32Value(
"tifftag.linear_units", directory);
644 return getInt32Value(
"tifftag.raster_type", directory);
649 return getInt32Value(
"tifftag.datum_code", directory);
654 return getInt32Value(
"tifftag.pcs_code", directory);
660 return getInt32Value(
"tifftag.gcs_code", directory);
668 if(getValue(tempStr, directory, key))
682 if(getValue(tempStr, directory, key))
692 return getDoubleValue(
"tifftag.origin_lat", directory);
697 return getDoubleValue(
"tifftag.origin_lon", directory);
702 return getDoubleValue(
"tifftag.std_parallel_1", directory);
707 return getDoubleValue(
"tifftag.std_parallel_2", directory);
712 return getDoubleValue(
"tifftag.false_easting", directory);
717 return getDoubleValue(
"tifftag.false_northing", directory);
723 return getDoubleValue(
"tifftag.scale_factor", directory);
730 if(getValue(tempStr, directory,
"tifftag.image_length"))
742 if(getValue(tempStr, directory,
"tifftag.image_width"))
750 bool ossim::TiffHandlerState::getDoubleArray(std::vector<ossim_float64>& result,
756 if(getValue(tempStr, directory, key))
768 return !result.
empty();
772 bool ossim::TiffHandlerState::getGeoDoubleParams(std::vector<ossim_float64>& result,
775 return getDoubleArray(result, directory,
"tifftag.geo_double_params");
778 bool ossim::TiffHandlerState::getGeoPixelScale(std::vector<ossim_float64>& result,
781 return getDoubleArray(result, directory,
"tifftag.geo_pixel_scale");
784 bool ossim::TiffHandlerState::getGeoTiePoints(std::vector<ossim_float64>& result,
787 return getDoubleArray(result, directory,
"tifftag.geo_tie_points");
790 bool ossim::TiffHandlerState::getGeoTransMatrix(std::vector<ossim_float64>& result,
793 return getDoubleArray(result, directory,
"tifftag.geo_trans_matrix");
799 bool result = ossim::ImageHandlerState::load(kwl, prefix);
805 m_tags.stripPrefixFromAll(
"^("+prefix+
")");
807 ossimString numberOfDirectories = kwl.
find(prefix,
"number_of_directories");
809 if(!numberOfDirectories.
empty()) m_tags.add(
"number_of_directories", numberOfDirectories,
true);
817 bool result = ossim::ImageHandlerState::save(kwl, prefix);
void clear()
Erases the entire container.
std::basic_ostringstream< char > ostringstream
Class for char output memory streams.
Represents serializable keyword/value map.
const char * find(const char *key) const
double nan()
Method to return ieee floating point double precision NAN.
static ossimString toString(bool aValue)
Numeric to string methods.
static StreamFactoryRegistry * instance()
unsigned short ossim_uint16
bool toSimpleVector(std::vector< T > &result, const ossimString &stringOfPoints)
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
bool toBool() const
String to numeric methods.
unsigned int ossim_uint32
void extractKeysThatMatch(ossimKeywordlist &kwl, const ossimString ®ularExpression) const
const char * c_str() const
Returns a pointer to a null-terminated array of characters representing the string's contents...
ossim_int64 toInt64() const
virtual std::shared_ptr< ossim::istream > createIstream(const std::string &connectionString, const ossimKeywordlist &options=ossimKeywordlist(), std::ios_base::openmode mode=std::ios_base::in|std::ios_base::binary) const
Will try to creates an istream interface to the connectionString passed in.
std::string::size_type find(const std::string &s, std::string::size_type pos=0) const
Searches for s as a substring of *this, beginning at character pos of *this.