diff --git a/IRC.Core.SCP/Service/CStoreSCPService.cs b/IRC.Core.SCP/Service/CStoreSCPService.cs index 1ce3063b9..7819a4366 100644 --- a/IRC.Core.SCP/Service/CStoreSCPService.cs +++ b/IRC.Core.SCP/Service/CStoreSCPService.cs @@ -493,18 +493,24 @@ namespace IRaCIS.Core.SCP.Service //需要拆成固定片段的 if (syntax.IsEncapsulated && fragmentCount == pixelData.NumberOfFrames) { + + + var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); - for (int n = 0; n < pixelData.NumberOfFrames; n++) + var newDataset = dicomFile.Dataset.Clone(); + + var dstPd = DicomPixelData.Create(newDataset, true); + + for (int i = 0; i < pixelData.NumberOfFrames; i++) { - var frameData = pixelData.GetFrame(n); // 获取完整一帧 - var data = frameData.Data; + var frame = pixelData.GetFrame(i); + + dstPd.AddFrame(frame); + + var data = frame.Data; int offset = 0; - bot.Add(botOffset); - - botOffset += (uint)data.Length +8 ; // 累加帧长度 - while (offset < data.Length) { int size = Math.Min(fragmentSize, data.Length - offset); @@ -516,19 +522,53 @@ namespace IRaCIS.Core.SCP.Service offset += size; } - } - //保留原始偏移表 - - if (originOffsetTable.Count == pixelData.NumberOfFrames) - { - newFragments.OffsetTable.AddRange(originOffsetTable.ToArray()); } - else - { - newFragments.OffsetTable.AddRange(bot.ToArray()); - } + var newOffsetTable = newDataset.GetDicomItem(DicomTag.PixelData).OffsetTable; + + newFragments.OffsetTable.AddRange(newOffsetTable.ToArray()); + + #region 暂时废弃 + + //for (int n = 0; n < pixelData.NumberOfFrames; n++) + //{ + // var frameData = pixelData.GetFrame(n); // 获取完整一帧 + // var data = frameData.Data; + // int offset = 0; + + // bot.Add(botOffset); + + // botOffset += (uint)data.Length + 8; // 累加帧长度 + + // while (offset < data.Length) + // { + // int size = Math.Min(fragmentSize, data.Length - offset); + // var buffer = new byte[size]; + // Buffer.BlockCopy(data, offset, buffer, 0, size); + + // newFragments.Fragments.Add(new MemoryByteBuffer(buffer)); + + // offset += size; + + // } + //} + + ////保留原始偏移表 + + //if (originOffsetTable.Count == pixelData.NumberOfFrames) + //{ + // newFragments.OffsetTable.AddRange(originOffsetTable.ToArray()); + + //} + //else + //{ + // newFragments.OffsetTable.AddRange(bot.ToArray()); + //} + + #endregion + + // 替换原 PixelData @@ -543,6 +583,8 @@ namespace IRaCIS.Core.SCP.Service else if (syntax.IsEncapsulated && fragmentCount > pixelData.NumberOfFrames && originOffsetTable.Count == 0) { + + uint offset = 0; bot.Add(offset); diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index 31ba365a1..1cb8faa52 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -1080,26 +1080,34 @@ namespace IRaCIS.Core.API.Controllers //获取像素是否为封装形式 var syntax = dicomFile.Dataset.InternalTransferSyntax; - //对于封装像素的文件做转换 - if (syntax.IsEncapsulated) + try { - // 创建一个新的片段序列 - var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); - // 获取每帧数据并封装为单独的片段 - for (int n = 0; n < pixelData.NumberOfFrames; n++) + //对于封装像素的文件做转换 + if (syntax.IsEncapsulated) { - var frameData = pixelData.GetFrame(n); - newFragments.Fragments.Add(new MemoryByteBuffer(frameData.Data)); + + // 创建一个新的片段序列 + var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); + // 获取每帧数据并封装为单独的片段 + for (int n = 0; n < pixelData.NumberOfFrames; n++) + { + var frameData = pixelData.GetFrame(n); + newFragments.Fragments.Add(new MemoryByteBuffer(frameData.Data)); + } + + var frag = dicomFile.Dataset.GetDicomItem(DicomTag.PixelData); + + var originOffsetTable = frag?.OffsetTable; + + newFragments.OffsetTable.AddRange(originOffsetTable?.ToArray()); + // 替换原有的片段序列 + dicomFile.Dataset.AddOrUpdate(newFragments); } + } + catch (Exception ex) + { - - var frag = dicomFile.Dataset.GetDicomItem(DicomTag.PixelData); - - var originOffsetTable = frag?.OffsetTable; - - newFragments.OffsetTable.AddRange(originOffsetTable?.ToArray()); - // 替换原有的片段序列 - dicomFile.Dataset.AddOrUpdate(newFragments); + Log.Logger.Warning($"处理多帧合并{instance.Path}失败: {ex.Message}"); } #endregion @@ -1149,10 +1157,10 @@ namespace IRaCIS.Core.API.Controllers } - [HttpPost("download/PatientStudyBatchDownload")] + [HttpGet("download/PatientStudyBatchDownload")] public async Task DownloadPatientStudyBatch([FromServices] IPatientService _patientService, [FromServices] IOSSService _oSSService, [FromServices] IHubContext _downLoadHub, - PatientImageDownloadCommand inCommand) + [FromQuery] PatientImageDownloadCommand inCommand) { inCommand.SCPStudyIdList = inCommand.SCPStudyIdList.Where(t => t != Guid.Empty).ToList(); var rusult = await _patientService.GetDownloadPatientStudyInfo(inCommand); @@ -1292,27 +1300,36 @@ namespace IRaCIS.Core.API.Controllers //获取像素是否为封装形式 var syntax = dicomFile.Dataset.InternalTransferSyntax; - //对于封装像素的文件做转换 - if (syntax.IsEncapsulated) + try { - // 创建一个新的片段序列 - var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); - // 获取每帧数据并封装为单独的片段 - for (int n = 0; n < pixelData.NumberOfFrames; n++) + //对于封装像素的文件做转换 + if (syntax.IsEncapsulated) { - var frameData = pixelData.GetFrame(n); - newFragments.Fragments.Add(new MemoryByteBuffer(frameData.Data)); + + // 创建一个新的片段序列 + var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); + // 获取每帧数据并封装为单独的片段 + for (int n = 0; n < pixelData.NumberOfFrames; n++) + { + var frameData = pixelData.GetFrame(n); + newFragments.Fragments.Add(new MemoryByteBuffer(frameData.Data)); + } + + var frag = dicomFile.Dataset.GetDicomItem(DicomTag.PixelData); + + var originOffsetTable = frag?.OffsetTable; + + newFragments.OffsetTable.AddRange(originOffsetTable?.ToArray()); + // 替换原有的片段序列 + dicomFile.Dataset.AddOrUpdate(newFragments); } - - var frag = dicomFile.Dataset.GetDicomItem(DicomTag.PixelData); - - var originOffsetTable = frag?.OffsetTable; - - newFragments.OffsetTable.AddRange(originOffsetTable?.ToArray()); - // 替换原有的片段序列 - dicomFile.Dataset.AddOrUpdate(newFragments); } + catch (Exception ex) + { + Log.Logger.Warning($"处理多帧合并{instance.Path}失败: {ex.Message}"); + } + #endregion await dicomFile.SaveAsync(entryStream); @@ -1361,11 +1378,11 @@ namespace IRaCIS.Core.API.Controllers - [HttpPost("download/VisitImageDownload")] + [HttpGet("download/VisitImageDownload")] public async Task VisitImageDownload([FromServices] IPatientService _patientService, [FromServices] IOSSService _oSSService, [FromServices] IHubContext _downLoadHub, [FromServices] IRepository _trialRepository, - VisitImageDownloadCommand inCommand) + [FromQuery] VisitImageDownloadCommand inCommand) { var rusult = await _patientService.GetDownloadSubjectVisitStudyInfo(inCommand); @@ -1505,19 +1522,34 @@ namespace IRaCIS.Core.API.Controllers //获取像素是否为封装形式 var syntax = dicomFile.Dataset.InternalTransferSyntax; - //对于封装像素的文件做转换 - if (syntax.IsEncapsulated) + try { - // 创建一个新的片段序列 - var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); - // 获取每帧数据并封装为单独的片段 - for (int n = 0; n < pixelData.NumberOfFrames; n++) + //对于封装像素的文件做转换 + if (syntax.IsEncapsulated) { - var frameData = pixelData.GetFrame(n); - newFragments.Fragments.Add(new MemoryByteBuffer(frameData.Data)); + + // 创建一个新的片段序列 + var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); + // 获取每帧数据并封装为单独的片段 + for (int n = 0; n < pixelData.NumberOfFrames; n++) + { + var frameData = pixelData.GetFrame(n); + newFragments.Fragments.Add(new MemoryByteBuffer(frameData.Data)); + } + + var frag = dicomFile.Dataset.GetDicomItem(DicomTag.PixelData); + + var originOffsetTable = frag?.OffsetTable; + + newFragments.OffsetTable.AddRange(originOffsetTable?.ToArray()); + // 替换原有的片段序列 + dicomFile.Dataset.AddOrUpdate(newFragments); } - // 替换原有的片段序列 - dicomFile.Dataset.AddOrUpdate(newFragments); + } + catch (Exception ex) + { + + Log.Logger.Warning($"处理多帧合并{instance.Path}失败: {ex.Message}"); } #endregion @@ -1572,7 +1604,7 @@ namespace IRaCIS.Core.API.Controllers public async Task ClinicalDataDownload([FromServices] IReadingClinicalDataService _readingClinicalDataService, [FromServices] IOSSService _oSSService, [FromServices] IHubContext _downLoadHub, [FromServices] IRepository _trialReadingCriterionRepository, -ClinicalDataDownloadDTO inCommand) +[FromQuery] ClinicalDataDownloadDTO inCommand) { var dataList = await _readingClinicalDataService.GetTrialClinicalDataSelect(inCommand);