diff Framework/Radiography/RadiographyScene.cpp @ 1259:69177b10e2b9

various fixes for RadiographyScene: support text layers outside the dicom layer, fix background in this case + extract dicom from rendered scene
author Alain Mazy <alain@mazy.be>
date Tue, 21 Jan 2020 16:52:37 +0100
parents 9c20ae049669
children 2d8ab34c8c91 a989c7d46b9a
line wrap: on
line diff
--- a/Framework/Radiography/RadiographyScene.cpp	Tue Jan 14 15:22:10 2020 +0100
+++ b/Framework/Radiography/RadiographyScene.cpp	Tue Jan 21 16:52:37 2020 +0100
@@ -658,6 +658,28 @@
     }
   }
 
+  void RadiographyScene::ExtractLayerFromRenderedScene(Orthanc::ImageAccessor& layer,
+                                                       const Orthanc::ImageAccessor& renderedScene,
+                                                       size_t layerIndex,
+                                                       ImageInterpolation interpolation)
+  {
+    Extent2D sceneExtent = GetSceneExtent();
+
+    double pixelSpacingX = sceneExtent.GetWidth() / renderedScene.GetWidth();
+    double pixelSpacingY = sceneExtent.GetHeight() / renderedScene.GetHeight();
+
+    AffineTransform2D view = AffineTransform2D::Combine(
+          AffineTransform2D::CreateScaling(1.0 / pixelSpacingX, 1.0 / pixelSpacingY),
+          AffineTransform2D::CreateOffset(-sceneExtent.GetX1(), -sceneExtent.GetY1()));
+
+    AffineTransform2D layerToSceneTransform = AffineTransform2D::Combine(
+          view,
+          GetLayer(layerIndex).GetTransform());
+
+    AffineTransform2D sceneToLayerTransform = AffineTransform2D::Invert(layerToSceneTransform);
+    sceneToLayerTransform.Apply(layer, renderedScene, interpolation, false);
+  }
+
   Orthanc::Image* RadiographyScene::ExportToImage(double pixelSpacingX,
                                                   double pixelSpacingY,
                                                   ImageInterpolation interpolation,
@@ -690,7 +712,14 @@
           AffineTransform2D::CreateOffset(-extent.GetX1(), -extent.GetY1()));
 
     // wipe background before rendering
-    Orthanc::ImageProcessing::Set(layers, 0);
+    if (GetPreferredPhotomotricDisplayMode() == RadiographyPhotometricDisplayMode_Monochrome1)
+    {
+      Orthanc::ImageProcessing::Set(layers, 65535.0f);
+    }
+    else
+    {
+      Orthanc::ImageProcessing::Set(layers, 0);
+    }
 
     Render(layers, view, interpolation, applyWindowing);