Mercurial > hg > orthanc
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());