From ba9a199345c301686a92d44e03b58e79671a1b1a Mon Sep 17 00:00:00 2001 From: Patrick Imbo <patrick.imbo@c-s.fr> Date: Tue, 4 Jul 2006 16:58:56 +0000 Subject: [PATCH] --- .../otbLineDetectorImageFilterBase.txx | 6 +- Code/IO/otbONERAImageIO.cxx | 62 ++++++++++++++----- Code/IO/otbONERAImageIO.h | 3 +- 3 files changed, 53 insertions(+), 18 deletions(-) diff --git a/Code/FeatureExtraction/otbLineDetectorImageFilterBase.txx b/Code/FeatureExtraction/otbLineDetectorImageFilterBase.txx index 66da4d9c17..26374b5378 100755 --- a/Code/FeatureExtraction/otbLineDetectorImageFilterBase.txx +++ b/Code/FeatureExtraction/otbLineDetectorImageFilterBase.txx @@ -270,8 +270,10 @@ void LineDetectorImageFilterBase< TInputImage, TOutputImage, InterpolatorType> // Loop on the region //for (i = 0; i < neighborhoodSize; ++i) - for (int i = 0; i < m_Radius[0]; ++i) - for (int j = 0; j < m_Radius[1]; ++j) +// for (int i = 0; i < m_Radius[0]; ++i) +// for (int j = 0; j < m_Radius[1]; ++j) + for (int i = 0; i < m_Radius[0]; i++) + for (int j = 0; j < m_Radius[1]; j++) { off[0]=i-m_Radius[0]/2; diff --git a/Code/IO/otbONERAImageIO.cxx b/Code/IO/otbONERAImageIO.cxx index 86e1a7b10a..e1a69c0553 100644 --- a/Code/IO/otbONERAImageIO.cxx +++ b/Code/IO/otbONERAImageIO.cxx @@ -52,6 +52,7 @@ ONERAImageIO::ONERAImageIO() m_Origin[0] = 0.0; m_Origin[1] = 0.0; + m_FlagWriteImageInformation = true; } @@ -451,32 +452,63 @@ bool ONERAImageIO::CanWriteFile( const char* FileNameToWrite ) void ONERAImageIO::Write(const void* buffer) { + if( m_FlagWriteImageInformation == true ) + { + otbMsgDevMacro(<<"ONERAImageIO::Write() m_FlagWriteImageInformation : " <<m_FlagWriteImageInformation ); + this->WriteImageInformation(); + m_FlagWriteImageInformation = false; + } - unsigned long step = this->GetNumberOfComponents(); - + unsigned long step = this->GetNumberOfComponents(); const unsigned long numberOfBytes = this->GetImageSizeInBytes(); const unsigned long numberOfComponents = this->GetImageSizeInComponents(); - char *tempmemory = new char[numberOfBytes]; - memcpy(tempmemory,buffer,numberOfBytes); + int lNbLignes = this->GetIORegion().GetSize()[1]; + int lNbColonnes = this->GetIORegion().GetSize()[0]; + int lPremiereLigne = this->GetIORegion().GetIndex()[1] ; // [1... ] + int lPremiereColonne = this->GetIORegion().GetIndex()[0] ; // [1... ] + + unsigned long numberOfBytesPerLines = step * lNbColonnes * m_NbOctetPixel; + unsigned long headerLength = ONERA_HEADER_LENGTH + 4 + numberOfBytesPerLines; + unsigned long offset; + unsigned long numberOfBytesToBeWrite = step * m_NbOctetPixel *lNbColonnes; + unsigned long numberOfBytesRegion = step * m_NbOctetPixel *lNbColonnes *lNbLignes; + unsigned long numberOfBytesWrite; + + + char *tempmemory = new char[numberOfBytesRegion]; + memcpy(tempmemory,buffer,numberOfBytesRegion); + if(this->GetComponentType() == FLOAT) { itk::ByteSwapper<float>::SwapRangeFromSystemToLittleEndian( - reinterpret_cast<float *>(tempmemory), numberOfComponents ); + reinterpret_cast<float *>(tempmemory), numberOfBytesRegion ); } - - int lNbLignes = this->GetIORegion().GetSize()[1]; - int lNbColonnes = this->GetIORegion().GetSize()[0]; + + char* value = new char[numberOfBytesToBeWrite]; + unsigned long cpt = 0; + + for(int LineNo = lPremiereLigne;LineNo <lPremiereLigne + lNbLignes; LineNo++ ) + { + for( unsigned long i=0 ; i < numberOfBytesToBeWrite ; i = i+ 2 * m_NbOctetPixel ) + { + memcpy((void*)(&(value[i])),(const void*)(&(tempmemory[cpt])),(size_t)( 2* m_NbOctetPixel) ); + cpt += 2*m_NbOctetPixel; + } - unsigned long numberOfBytesPerLines = 2 * lNbColonnes * m_NbOctetPixel; - unsigned long headerLength = ONERA_HEADER_LENGTH + 4 + numberOfBytesPerLines; - unsigned long offset; + offset = headerLength + numberOfBytesPerLines * LineNo; + offset += m_NbOctetPixel * lPremiereColonne; + m_Datafile.seekg(offset, std::ios::beg); + m_Datafile.write( static_cast<char *>( value ), numberOfBytesToBeWrite ); + numberOfBytesWrite = m_Datafile.gcount(); + m_Datafile.seekg(offset, std::ios::end); + } - offset = headerLength + numberOfBytesPerLines; - m_Datafile.seekg(offset, std::ios::beg); - m_Datafile.write( static_cast<const char *>(tempmemory) , numberOfBytes ); + delete [] value; delete [] tempmemory; + + } void ONERAImageIO::WriteImageInformation() @@ -504,7 +536,7 @@ void ONERAImageIO::WriteImageInformation() m_Headerfile << "# [dans ordre LSBfirst = big-endian]" << std::endl; std::string sPixelType("cmplx_real_4"); - if(m_PixelType == COMPLEX && m_ComponentType == FLOAT) + if( (this->GetPixelType() == COMPLEX) && (m_ComponentType == FLOAT) ) { sPixelType = "cmplx_real_4"; } diff --git a/Code/IO/otbONERAImageIO.h b/Code/IO/otbONERAImageIO.h index fe155d806f..2f30822668 100644 --- a/Code/IO/otbONERAImageIO.h +++ b/Code/IO/otbONERAImageIO.h @@ -128,7 +128,8 @@ private: /** Nombre d'octets par pixel */ - int m_NbOctetPixel; + int m_NbOctetPixel; + bool m_FlagWriteImageInformation; }; -- GitLab