Mercurial > hg > orthanc
comparison OrthancFramework/Sources/DicomParsing/DcmtkTranscoder.cpp @ 5363:3c8286e5d07b multiple-jpeg-decoders
wip: try to add a jpeg decoder without colorspace conversion: not working now
author | Alain Mazy <am@osimis.io> |
---|---|
date | Tue, 11 Jul 2023 10:25:58 +0200 |
parents | 0ea402b4d901 |
children |
comparison
equal
deleted
inserted
replaced
5360:165b67c02927 | 5363:3c8286e5d07b |
---|---|
85 | 85 |
86 | 86 |
87 bool DcmtkTranscoder::InplaceTranscode(DicomTransferSyntax& selectedSyntax /* out */, | 87 bool DcmtkTranscoder::InplaceTranscode(DicomTransferSyntax& selectedSyntax /* out */, |
88 DcmFileFormat& dicom, | 88 DcmFileFormat& dicom, |
89 const std::set<DicomTransferSyntax>& allowedSyntaxes, | 89 const std::set<DicomTransferSyntax>& allowedSyntaxes, |
90 bool allowNewSopInstanceUid) | 90 bool allowNewSopInstanceUid, |
91 bool enableColorMapConversion) | |
91 { | 92 { |
92 if (dicom.getDataset() == NULL) | 93 if (dicom.getDataset() == NULL) |
93 { | 94 { |
94 throw OrthancException(ErrorCode_InternalError); | 95 throw OrthancException(ErrorCode_InternalError); |
95 } | 96 } |
109 // No transcoding is needed | 110 // No transcoding is needed |
110 return true; | 111 return true; |
111 } | 112 } |
112 | 113 |
113 if (allowedSyntaxes.find(DicomTransferSyntax_LittleEndianImplicit) != allowedSyntaxes.end() && | 114 if (allowedSyntaxes.find(DicomTransferSyntax_LittleEndianImplicit) != allowedSyntaxes.end() && |
114 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_LittleEndianImplicit, NULL)) | 115 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_LittleEndianImplicit, NULL, enableColorMapConversion)) |
115 { | 116 { |
116 selectedSyntax = DicomTransferSyntax_LittleEndianImplicit; | 117 selectedSyntax = DicomTransferSyntax_LittleEndianImplicit; |
117 return true; | 118 return true; |
118 } | 119 } |
119 | 120 |
120 if (allowedSyntaxes.find(DicomTransferSyntax_LittleEndianExplicit) != allowedSyntaxes.end() && | 121 if (allowedSyntaxes.find(DicomTransferSyntax_LittleEndianExplicit) != allowedSyntaxes.end() && |
121 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_LittleEndianExplicit, NULL)) | 122 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_LittleEndianExplicit, NULL, enableColorMapConversion)) |
122 { | 123 { |
123 selectedSyntax = DicomTransferSyntax_LittleEndianExplicit; | 124 selectedSyntax = DicomTransferSyntax_LittleEndianExplicit; |
124 return true; | 125 return true; |
125 } | 126 } |
126 | 127 |
127 if (allowedSyntaxes.find(DicomTransferSyntax_BigEndianExplicit) != allowedSyntaxes.end() && | 128 if (allowedSyntaxes.find(DicomTransferSyntax_BigEndianExplicit) != allowedSyntaxes.end() && |
128 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_BigEndianExplicit, NULL)) | 129 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_BigEndianExplicit, NULL, enableColorMapConversion)) |
129 { | 130 { |
130 selectedSyntax = DicomTransferSyntax_BigEndianExplicit; | 131 selectedSyntax = DicomTransferSyntax_BigEndianExplicit; |
131 return true; | 132 return true; |
132 } | 133 } |
133 | 134 |
134 if (allowedSyntaxes.find(DicomTransferSyntax_DeflatedLittleEndianExplicit) != allowedSyntaxes.end() && | 135 if (allowedSyntaxes.find(DicomTransferSyntax_DeflatedLittleEndianExplicit) != allowedSyntaxes.end() && |
135 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_DeflatedLittleEndianExplicit, NULL)) | 136 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_DeflatedLittleEndianExplicit, NULL, enableColorMapConversion)) |
136 { | 137 { |
137 selectedSyntax = DicomTransferSyntax_DeflatedLittleEndianExplicit; | 138 selectedSyntax = DicomTransferSyntax_DeflatedLittleEndianExplicit; |
138 return true; | 139 return true; |
139 } | 140 } |
140 | 141 |
144 (!hasBitsStored || bitsStored == 8)) | 145 (!hasBitsStored || bitsStored == 8)) |
145 { | 146 { |
146 // Check out "dcmjpeg/apps/dcmcjpeg.cc" | 147 // Check out "dcmjpeg/apps/dcmcjpeg.cc" |
147 DJ_RPLossy parameters(lossyQuality_); | 148 DJ_RPLossy parameters(lossyQuality_); |
148 | 149 |
149 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess1, ¶meters)) | 150 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess1, ¶meters, enableColorMapConversion)) |
150 { | 151 { |
151 selectedSyntax = DicomTransferSyntax_JPEGProcess1; | 152 selectedSyntax = DicomTransferSyntax_JPEGProcess1; |
152 return true; | 153 return true; |
153 } | 154 } |
154 } | 155 } |
159 allowNewSopInstanceUid && | 160 allowNewSopInstanceUid && |
160 (!hasBitsStored || bitsStored <= 12)) | 161 (!hasBitsStored || bitsStored <= 12)) |
161 { | 162 { |
162 // Check out "dcmjpeg/apps/dcmcjpeg.cc" | 163 // Check out "dcmjpeg/apps/dcmcjpeg.cc" |
163 DJ_RPLossy parameters(lossyQuality_); | 164 DJ_RPLossy parameters(lossyQuality_); |
164 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess2_4, ¶meters)) | 165 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess2_4, ¶meters, enableColorMapConversion)) |
165 { | 166 { |
166 selectedSyntax = DicomTransferSyntax_JPEGProcess2_4; | 167 selectedSyntax = DicomTransferSyntax_JPEGProcess2_4; |
167 return true; | 168 return true; |
168 } | 169 } |
169 } | 170 } |
173 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess14) != allowedSyntaxes.end()) | 174 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess14) != allowedSyntaxes.end()) |
174 { | 175 { |
175 // Check out "dcmjpeg/apps/dcmcjpeg.cc" | 176 // Check out "dcmjpeg/apps/dcmcjpeg.cc" |
176 DJ_RPLossless parameters(6 /* opt_selection_value */, | 177 DJ_RPLossless parameters(6 /* opt_selection_value */, |
177 0 /* opt_point_transform */); | 178 0 /* opt_point_transform */); |
178 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess14, ¶meters)) | 179 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess14, ¶meters, enableColorMapConversion)) |
179 { | 180 { |
180 selectedSyntax = DicomTransferSyntax_JPEGProcess14; | 181 selectedSyntax = DicomTransferSyntax_JPEGProcess14; |
181 return true; | 182 return true; |
182 } | 183 } |
183 } | 184 } |
187 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess14SV1) != allowedSyntaxes.end()) | 188 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess14SV1) != allowedSyntaxes.end()) |
188 { | 189 { |
189 // Check out "dcmjpeg/apps/dcmcjpeg.cc" | 190 // Check out "dcmjpeg/apps/dcmcjpeg.cc" |
190 DJ_RPLossless parameters(6 /* opt_selection_value */, | 191 DJ_RPLossless parameters(6 /* opt_selection_value */, |
191 0 /* opt_point_transform */); | 192 0 /* opt_point_transform */); |
192 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess14SV1, ¶meters)) | 193 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess14SV1, ¶meters, enableColorMapConversion)) |
193 { | 194 { |
194 selectedSyntax = DicomTransferSyntax_JPEGProcess14SV1; | 195 selectedSyntax = DicomTransferSyntax_JPEGProcess14SV1; |
195 return true; | 196 return true; |
196 } | 197 } |
197 } | 198 } |
206 | 207 |
207 /** | 208 /** |
208 * WARNING: This call results in a segmentation fault if using | 209 * WARNING: This call results in a segmentation fault if using |
209 * the DCMTK package 3.6.2 from Ubuntu 18.04. | 210 * the DCMTK package 3.6.2 from Ubuntu 18.04. |
210 **/ | 211 **/ |
211 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGLSLossless, ¶meters)) | 212 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGLSLossless, ¶meters, enableColorMapConversion)) |
212 { | 213 { |
213 selectedSyntax = DicomTransferSyntax_JPEGLSLossless; | 214 selectedSyntax = DicomTransferSyntax_JPEGLSLossless; |
214 return true; | 215 return true; |
215 } | 216 } |
216 } | 217 } |
226 | 227 |
227 /** | 228 /** |
228 * WARNING: This call results in a segmentation fault if using | 229 * WARNING: This call results in a segmentation fault if using |
229 * the DCMTK package 3.6.2 from Ubuntu 18.04. | 230 * the DCMTK package 3.6.2 from Ubuntu 18.04. |
230 **/ | 231 **/ |
231 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGLSLossy, ¶meters)) | 232 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGLSLossy, ¶meters, enableColorMapConversion)) |
232 { | 233 { |
233 selectedSyntax = DicomTransferSyntax_JPEGLSLossy; | 234 selectedSyntax = DicomTransferSyntax_JPEGLSLossy; |
234 return true; | 235 return true; |
235 } | 236 } |
236 } | 237 } |
272 | 273 |
273 | 274 |
274 bool DcmtkTranscoder::Transcode(DicomImage& target, | 275 bool DcmtkTranscoder::Transcode(DicomImage& target, |
275 DicomImage& source /* in, "GetParsed()" possibly modified */, | 276 DicomImage& source /* in, "GetParsed()" possibly modified */, |
276 const std::set<DicomTransferSyntax>& allowedSyntaxes, | 277 const std::set<DicomTransferSyntax>& allowedSyntaxes, |
277 bool allowNewSopInstanceUid) | 278 bool allowNewSopInstanceUid, |
279 bool enableColorMapConversion) | |
278 { | 280 { |
279 target.Clear(); | 281 target.Clear(); |
280 | 282 |
281 DicomTransferSyntax sourceSyntax; | 283 DicomTransferSyntax sourceSyntax; |
282 if (!FromDcmtkBridge::LookupOrthancTransferSyntax(sourceSyntax, source.GetParsed())) | 284 if (!FromDcmtkBridge::LookupOrthancTransferSyntax(sourceSyntax, source.GetParsed())) |
318 target.AcquireParsed(source); | 320 target.AcquireParsed(source); |
319 target.AcquireBuffer(source); | 321 target.AcquireBuffer(source); |
320 return true; | 322 return true; |
321 } | 323 } |
322 else if (InplaceTranscode(targetSyntax, source.GetParsed(), | 324 else if (InplaceTranscode(targetSyntax, source.GetParsed(), |
323 allowedSyntaxes, allowNewSopInstanceUid)) | 325 allowedSyntaxes, allowNewSopInstanceUid, enableColorMapConversion)) |
324 { | 326 { |
325 // Sanity check | 327 // Sanity check |
326 DicomTransferSyntax targetSyntax2; | 328 DicomTransferSyntax targetSyntax2; |
327 if (FromDcmtkBridge::LookupOrthancTransferSyntax(targetSyntax2, source.GetParsed()) && | 329 if (FromDcmtkBridge::LookupOrthancTransferSyntax(targetSyntax2, source.GetParsed()) && |
328 targetSyntax == targetSyntax2 && | 330 targetSyntax == targetSyntax2 && |