Mercurial > hg > orthanc
comparison OrthancServer/ParsedDicomFile.cpp @ 1826:ac5b0b4e2434
refactoring of DicomImageDecoder
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 25 Nov 2015 16:00:57 +0100 |
parents | b530c3dfe2a6 |
children | 4b6673e828f4 |
comparison
equal
deleted
inserted
replaced
1825:f0f8a94c0858 | 1826:ac5b0b4e2434 |
---|---|
1046 throw OrthancException(ErrorCode_InternalError); | 1046 throw OrthancException(ErrorCode_InternalError); |
1047 } | 1047 } |
1048 } | 1048 } |
1049 | 1049 |
1050 | 1050 |
1051 void ParsedDicomFile::ExtractImage(ImageBuffer& result, | 1051 ImageAccessor* ParsedDicomFile::ExtractImage(IDicomImageDecoder& decoder, |
1052 IDicomImageDecoder& decoder, | 1052 unsigned int frame) |
1053 unsigned int frame) | 1053 { |
1054 { | 1054 std::auto_ptr<ImageAccessor> decoded(decoder.Decode(*this, frame)); |
1055 if (!decoder.Decode(result, *this, frame)) | 1055 |
1056 { | 1056 if (decoded.get() == NULL) |
1057 { | |
1058 LOG(ERROR) << "Cannot decode a DICOM image"; | |
1057 throw OrthancException(ErrorCode_BadFileFormat); | 1059 throw OrthancException(ErrorCode_BadFileFormat); |
1058 } | 1060 } |
1059 } | 1061 else |
1060 | 1062 { |
1061 | 1063 return decoded.release(); |
1062 void ParsedDicomFile::ExtractImage(ImageBuffer& result, | 1064 } |
1063 IDicomImageDecoder& decoder, | 1065 } |
1064 unsigned int frame, | 1066 |
1065 ImageExtractionMode mode) | 1067 |
1066 { | 1068 ImageAccessor* ParsedDicomFile::ExtractImage(IDicomImageDecoder& decoder, |
1067 ImageBuffer source; | 1069 unsigned int frame, |
1068 if (!decoder.Decode(source, *this, frame)) | 1070 ImageExtractionMode mode) |
1069 { | 1071 { |
1070 throw OrthancException(ErrorCode_BadFileFormat); | 1072 std::auto_ptr<ImageAccessor> decoded(ExtractImage(decoder, frame)); |
1071 } | |
1072 | 1073 |
1073 bool ok = false; | 1074 bool ok = false; |
1074 | 1075 |
1075 switch (mode) | 1076 switch (mode) |
1076 { | 1077 { |
1077 case ImageExtractionMode_UInt8: | 1078 case ImageExtractionMode_UInt8: |
1078 ok = DicomImageDecoder::TruncateDecodedImage(result, source, PixelFormat_Grayscale8, false); | 1079 ok = DicomImageDecoder::TruncateDecodedImage(decoded, PixelFormat_Grayscale8, false); |
1079 break; | 1080 break; |
1080 | 1081 |
1081 case ImageExtractionMode_UInt16: | 1082 case ImageExtractionMode_UInt16: |
1082 ok = DicomImageDecoder::TruncateDecodedImage(result, source, PixelFormat_Grayscale16, false); | 1083 ok = DicomImageDecoder::TruncateDecodedImage(decoded, PixelFormat_Grayscale16, false); |
1083 break; | 1084 break; |
1084 | 1085 |
1085 case ImageExtractionMode_Int16: | 1086 case ImageExtractionMode_Int16: |
1086 ok = DicomImageDecoder::TruncateDecodedImage(result, source, PixelFormat_SignedGrayscale16, false); | 1087 ok = DicomImageDecoder::TruncateDecodedImage(decoded, PixelFormat_SignedGrayscale16, false); |
1087 break; | 1088 break; |
1088 | 1089 |
1089 case ImageExtractionMode_Preview: | 1090 case ImageExtractionMode_Preview: |
1090 ok = DicomImageDecoder::PreviewDecodedImage(result, source); | 1091 ok = DicomImageDecoder::PreviewDecodedImage(decoded); |
1091 break; | 1092 break; |
1092 | 1093 |
1093 default: | 1094 default: |
1094 throw OrthancException(ErrorCode_ParameterOutOfRange); | 1095 throw OrthancException(ErrorCode_ParameterOutOfRange); |
1095 } | 1096 } |
1096 | 1097 |
1097 if (!ok) | 1098 if (ok) |
1099 { | |
1100 assert(decoded.get() != NULL); | |
1101 return decoded.release(); | |
1102 } | |
1103 else | |
1098 { | 1104 { |
1099 throw OrthancException(ErrorCode_NotImplemented); | 1105 throw OrthancException(ErrorCode_NotImplemented); |
1100 } | 1106 } |
1101 } | 1107 } |
1102 | 1108 |
1104 void ParsedDicomFile::ExtractPngImage(std::string& result, | 1110 void ParsedDicomFile::ExtractPngImage(std::string& result, |
1105 IDicomImageDecoder& decoder, | 1111 IDicomImageDecoder& decoder, |
1106 unsigned int frame, | 1112 unsigned int frame, |
1107 ImageExtractionMode mode) | 1113 ImageExtractionMode mode) |
1108 { | 1114 { |
1109 ImageBuffer buffer; | 1115 std::auto_ptr<ImageAccessor> decoded(ExtractImage(decoder, frame, mode)); |
1110 ExtractImage(buffer, decoder, frame, mode); | 1116 assert(decoded.get() != NULL); |
1111 | 1117 |
1112 ImageAccessor accessor(buffer.GetConstAccessor()); | |
1113 PngWriter writer; | 1118 PngWriter writer; |
1114 writer.WriteToMemory(result, accessor); | 1119 writer.WriteToMemory(result, *decoded); |
1115 } | 1120 } |
1116 | 1121 |
1117 | 1122 |
1118 void ParsedDicomFile::ExtractJpegImage(std::string& result, | 1123 void ParsedDicomFile::ExtractJpegImage(std::string& result, |
1119 IDicomImageDecoder& decoder, | 1124 IDicomImageDecoder& decoder, |
1125 mode != ImageExtractionMode_Preview) | 1130 mode != ImageExtractionMode_Preview) |
1126 { | 1131 { |
1127 throw OrthancException(ErrorCode_ParameterOutOfRange); | 1132 throw OrthancException(ErrorCode_ParameterOutOfRange); |
1128 } | 1133 } |
1129 | 1134 |
1130 ImageBuffer buffer; | 1135 std::auto_ptr<ImageAccessor> decoded(ExtractImage(decoder, frame, mode)); |
1131 ExtractImage(buffer, decoder, frame, mode); | 1136 assert(decoded.get() != NULL); |
1132 | 1137 |
1133 ImageAccessor accessor(buffer.GetConstAccessor()); | |
1134 JpegWriter writer; | 1138 JpegWriter writer; |
1135 writer.SetQuality(quality); | 1139 writer.SetQuality(quality); |
1136 writer.WriteToMemory(result, accessor); | 1140 writer.WriteToMemory(result, *decoded); |
1137 } | 1141 } |
1138 | 1142 |
1139 | 1143 |
1140 Encoding ParsedDicomFile::GetEncoding() const | 1144 Encoding ParsedDicomFile::GetEncoding() const |
1141 { | 1145 { |