Mercurial > hg > orthanc
comparison Core/DicomParsing/DcmtkTranscoder.cpp @ 3938:54dbebbcc032 transcoding
fix
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 18 May 2020 15:59:50 +0200 |
parents | 7dc5e7e0045d |
children | c205f670098e |
comparison
equal
deleted
inserted
replaced
3937:41eec97c23ef | 3938:54dbebbcc032 |
---|---|
53 #include <dcmtk/dcmjpls/djrparam.h> // for DJLSRepresentationParameter | 53 #include <dcmtk/dcmjpls/djrparam.h> // for DJLSRepresentationParameter |
54 | 54 |
55 | 55 |
56 namespace Orthanc | 56 namespace Orthanc |
57 { | 57 { |
58 static uint16_t GetBitsStored(DcmDataset& dataset) | 58 static bool GetBitsStored(uint16_t& bitsStored, |
59 { | 59 DcmDataset& dataset) |
60 uint16_t bitsStored; | 60 { |
61 if (dataset.findAndGetUint16(DCM_BitsStored, bitsStored).good()) | 61 return dataset.findAndGetUint16(DCM_BitsStored, bitsStored).good(); |
62 { | |
63 return bitsStored; | |
64 } | |
65 else | |
66 { | |
67 throw OrthancException(ErrorCode_BadFileFormat, | |
68 "Missing \"Bits Stored\" tag in DICOM instance"); | |
69 } | |
70 } | 62 } |
71 | 63 |
72 | 64 |
73 static std::string GetSopInstanceUid(DcmDataset& dataset) | 65 static std::string GetSopInstanceUid(DcmDataset& dataset) |
74 { | 66 { |
92 { | 84 { |
93 if (dicom.getDataset() == NULL) | 85 if (dicom.getDataset() == NULL) |
94 { | 86 { |
95 throw OrthancException(ErrorCode_InternalError); | 87 throw OrthancException(ErrorCode_InternalError); |
96 } | 88 } |
97 | 89 |
98 bool ok; | 90 bool ok; |
99 | 91 |
100 if (mustEqual) | 92 if (dicom.getDataset()->tagExists(DCM_PixelData)) |
101 { | 93 { |
94 if (mustEqual) | |
95 { | |
96 ok = (GetSopInstanceUid(*dicom.getDataset()) == sopInstanceUid); | |
97 } | |
98 else | |
99 { | |
100 ok = (GetSopInstanceUid(*dicom.getDataset()) != sopInstanceUid); | |
101 } | |
102 } | |
103 else | |
104 { | |
105 // No pixel data: Transcoding must not change the SOP instance UID | |
102 ok = (GetSopInstanceUid(*dicom.getDataset()) == sopInstanceUid); | 106 ok = (GetSopInstanceUid(*dicom.getDataset()) == sopInstanceUid); |
103 } | 107 } |
104 else | 108 |
105 { | |
106 ok = (GetSopInstanceUid(*dicom.getDataset()) != sopInstanceUid); | |
107 } | |
108 | |
109 if (!ok) | 109 if (!ok) |
110 { | 110 { |
111 throw OrthancException(ErrorCode_InternalError, | 111 throw OrthancException(ErrorCode_InternalError, |
112 mustEqual ? "The SOP instance UID has changed unexpectedly during transcoding" : | 112 mustEqual ? "The SOP instance UID has changed unexpectedly during transcoding" : |
113 "The SOP instance UID has not changed as expected during transcoding"); | 113 "The SOP instance UID has not changed as expected during transcoding"); |
146 { | 146 { |
147 throw OrthancException(ErrorCode_BadFileFormat, | 147 throw OrthancException(ErrorCode_BadFileFormat, |
148 "Cannot determine the transfer syntax"); | 148 "Cannot determine the transfer syntax"); |
149 } | 149 } |
150 | 150 |
151 const uint16_t bitsStored = GetBitsStored(*dicom.getDataset()); | 151 uint16_t bitsStored; |
152 bool hasBitsStored = GetBitsStored(bitsStored, *dicom.getDataset()); | |
153 | |
152 std::string sourceSopInstanceUid = GetSopInstanceUid(*dicom.getDataset()); | 154 std::string sourceSopInstanceUid = GetSopInstanceUid(*dicom.getDataset()); |
153 | 155 |
154 if (allowedSyntaxes.find(syntax) != allowedSyntaxes.end()) | 156 if (allowedSyntaxes.find(syntax) != allowedSyntaxes.end()) |
155 { | 157 { |
156 // No transcoding is needed | 158 // No transcoding is needed |
186 } | 188 } |
187 | 189 |
188 #if ORTHANC_ENABLE_DCMTK_JPEG == 1 | 190 #if ORTHANC_ENABLE_DCMTK_JPEG == 1 |
189 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess1) != allowedSyntaxes.end() && | 191 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess1) != allowedSyntaxes.end() && |
190 allowNewSopInstanceUid && | 192 allowNewSopInstanceUid && |
191 bitsStored == 8) | 193 (!hasBitsStored || bitsStored == 8)) |
192 { | 194 { |
193 // Check out "dcmjpeg/apps/dcmcjpeg.cc" | 195 // Check out "dcmjpeg/apps/dcmcjpeg.cc" |
194 DJ_RPLossy parameters(lossyQuality_); | 196 DJ_RPLossy parameters(lossyQuality_); |
195 | 197 |
196 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess1, ¶meters)) | 198 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess1, ¶meters)) |
203 #endif | 205 #endif |
204 | 206 |
205 #if ORTHANC_ENABLE_DCMTK_JPEG == 1 | 207 #if ORTHANC_ENABLE_DCMTK_JPEG == 1 |
206 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess2_4) != allowedSyntaxes.end() && | 208 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess2_4) != allowedSyntaxes.end() && |
207 allowNewSopInstanceUid && | 209 allowNewSopInstanceUid && |
208 bitsStored <= 12) | 210 (!hasBitsStored || bitsStored <= 12)) |
209 { | 211 { |
210 // Check out "dcmjpeg/apps/dcmcjpeg.cc" | 212 // Check out "dcmjpeg/apps/dcmcjpeg.cc" |
211 DJ_RPLossy parameters(lossyQuality_); | 213 DJ_RPLossy parameters(lossyQuality_); |
212 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess2_4, ¶meters)) | 214 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess2_4, ¶meters)) |
213 { | 215 { |