diff OrthancServer/ParsedDicomFile.cpp @ 1781:5ad4e4d92ecb

AcceptMediaDispatcher bootstrap
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 17 Nov 2015 17:46:32 +0100
parents ec66a16aa398
children 164d78911382
line wrap: on
line diff
--- a/OrthancServer/ParsedDicomFile.cpp	Fri Nov 13 15:06:45 2015 +0100
+++ b/OrthancServer/ParsedDicomFile.cpp	Tue Nov 17 17:46:32 2015 +0100
@@ -84,14 +84,16 @@
 #include "FromDcmtkBridge.h"
 #include "ToDcmtkBridge.h"
 #include "Internals/DicomImageDecoder.h"
-#include "../Core/Logging.h"
-#include "../Core/Toolbox.h"
-#include "../Core/OrthancException.h"
+#include "../Core/DicomFormat/DicomIntegerPixelAccessor.h"
 #include "../Core/Images/ImageBuffer.h"
+#include "../Core/Images/JpegWriter.h"
+#include "../Core/Images/JpegReader.h"
+#include "../Core/Images/PngReader.h"
 #include "../Core/Images/PngWriter.h"
+#include "../Core/Logging.h"
+#include "../Core/OrthancException.h"
+#include "../Core/Toolbox.h"
 #include "../Core/Uuid.h"
-#include "../Core/DicomFormat/DicomIntegerPixelAccessor.h"
-#include "../Core/Images/PngReader.h"
 
 #include <list>
 #include <limits>
@@ -796,36 +798,6 @@
   }
 
 
-  template <typename T>
-  static void ExtractPngImageTruncate(std::string& result,
-                                      DicomIntegerPixelAccessor& accessor,
-                                      PixelFormat format)
-  {
-    assert(accessor.GetInformation().GetChannelCount() == 1);
-
-    PngWriter w;
-
-    std::vector<T> image(accessor.GetInformation().GetWidth() * accessor.GetInformation().GetHeight(), 0);
-    T* pixel = &image[0];
-    for (unsigned int y = 0; y < accessor.GetInformation().GetHeight(); y++)
-    {
-      for (unsigned int x = 0; x < accessor.GetInformation().GetWidth(); x++, pixel++)
-      {
-        int32_t v = accessor.GetValue(x, y);
-        if (v < static_cast<int32_t>(std::numeric_limits<T>::min()))
-          *pixel = std::numeric_limits<T>::min();
-        else if (v > static_cast<int32_t>(std::numeric_limits<T>::max()))
-          *pixel = std::numeric_limits<T>::max();
-        else
-          *pixel = static_cast<T>(v);
-      }
-    }
-
-    w.WriteToMemory(result, accessor.GetInformation().GetWidth(), accessor.GetInformation().GetHeight(),
-                    accessor.GetInformation().GetWidth() * sizeof(T), format, &image[0]);
-  }
-
-
   void ParsedDicomFile::SaveToMemoryBuffer(std::string& buffer)
   {
     FromDcmtkBridge::SaveToMemoryBuffer(buffer, *pimpl_->file_->getDataset());
@@ -903,7 +875,8 @@
     Toolbox::DecodeDataUriScheme(mime, content, dataUriScheme);
     Toolbox::ToLowerCase(mime);
 
-    if (mime == "image/png")
+    if (mime == "image/png" ||
+        mime == "image/jpeg")
     {
       EmbedImage(mime, content);
     }
@@ -928,6 +901,12 @@
       reader.ReadFromMemory(content);
       EmbedImage(reader);
     }
+    else if (mime == "image/jpeg")
+    {
+      JpegReader reader;
+      reader.ReadFromMemory(content);
+      EmbedImage(reader);
+    }
     else
     {
       throw OrthancException(ErrorCode_NotImplemented);
@@ -1100,6 +1079,27 @@
   }
 
 
+  void ParsedDicomFile::ExtractJpegImage(std::string& result,
+                                         unsigned int frame,
+                                         ImageExtractionMode mode,
+                                         uint8_t quality)
+  {
+    if (mode != ImageExtractionMode_UInt8 &&
+        mode != ImageExtractionMode_Preview)
+    {
+      throw OrthancException(ErrorCode_ParameterOutOfRange);
+    }
+
+    ImageBuffer buffer;
+    ExtractImage(buffer, frame, mode);
+
+    ImageAccessor accessor(buffer.GetConstAccessor());
+    JpegWriter writer;
+    writer.SetQuality(quality);
+    writer.WriteToMemory(result, accessor);
+  }
+
+
   Encoding ParsedDicomFile::GetEncoding() const
   {
     return FromDcmtkBridge::DetectEncoding(*pimpl_->file_->getDataset());