diff --git a/Modules/IO/ImageIO/include/otbImageFileWriter.txx b/Modules/IO/ImageIO/include/otbImageFileWriter.txx
index 593019fd924b3497fc628e7d60298bf774c9aab3..711ccd99b543f7f168efc8f5e61f86c57d298f7a 100644
--- a/Modules/IO/ImageIO/include/otbImageFileWriter.txx
+++ b/Modules/IO/ImageIO/include/otbImageFileWriter.txx
@@ -468,6 +468,9 @@ ImageFileWriter<TInputImage>
    */
   inputPtr->UpdateOutputInformation();
   InputImageRegionType inputRegion = inputPtr->GetLargestPossibleRegion();
+  typename TInputImage::PointType origin = inputPtr->GetOrigin();
+  const typename TInputImage::SpacingType&   spacing = inputPtr->GetSpacing();
+  const typename TInputImage::DirectionType& direction = inputPtr->GetDirection();
 
   /** Parse region size modes */
   if(m_FilenameHelper->BoxIsSet())
@@ -483,7 +486,6 @@ ImageFileWriter<TInputImage>
     start[1] = boxVector[1];  // first index on Y
     size[0]  = boxVector[2];  // size along X
     size[1]  = boxVector[3];  // size along Y
-
     inputRegion.SetSize(size);
 
     m_ShiftOutputIndex = start;
@@ -501,6 +503,9 @@ ImageFileWriter<TInputImage>
       e.SetDataObject(inputPtr);
       throw e;
       }
+
+    inputPtr->TransformIndexToPhysicalPoint(inputRegion.GetIndex(), origin);
+
     otbLogMacro(Info,<<"Writing user defined region ["<<start[0]<<", "<<start[0]+size[0]-1<<"]x["<<start[1]<<", "<<start[1]+size[1]<<"]");
     }
 
@@ -542,9 +547,6 @@ ImageFileWriter<TInputImage>
   // Setup the ImageIO with information from inputPtr
   //
   m_ImageIO->SetNumberOfDimensions(TInputImage::ImageDimension);
-  const typename TInputImage::SpacingType&   spacing = inputPtr->GetSpacing();
-  const typename TInputImage::PointType&     origin = inputPtr->GetOrigin();
-  const typename TInputImage::DirectionType& direction = inputPtr->GetDirection();
   int direction_sign(0);
   for (unsigned int i = 0; i < TInputImage::ImageDimension; ++i)
     {
@@ -555,7 +557,7 @@ ImageFileWriter<TInputImage>
     // Final image size
     m_ImageIO->SetDimensions(i, inputRegion.GetSize(i));
     m_ImageIO->SetSpacing(i, direction_sign * spacing[i]);
-    m_ImageIO->SetOrigin(i, origin[i] + static_cast<double>(inputRegion.GetIndex()[i]) * spacing[i]);
+    m_ImageIO->SetOrigin(i, origin[i]);
 
     vnl_vector<double> axisDirection(TInputImage::ImageDimension);
     // Please note: direction cosines are stored as columns of the