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 {