diff --git a/IRC.Core.SCP/Service/CStoreSCPService.cs b/IRC.Core.SCP/Service/CStoreSCPService.cs index 1b836a0f2..ce84949a6 100644 --- a/IRC.Core.SCP/Service/CStoreSCPService.cs +++ b/IRC.Core.SCP/Service/CStoreSCPService.cs @@ -473,199 +473,216 @@ namespace IRaCIS.Core.SCP.Service var dicomFile = DicomFile.Open(ms); var pixelData = DicomPixelData.Create(dicomFile.Dataset); - var syntax = pixelData.Syntax; - // 每个 fragment 固定大小 (64KB 示例,可以自己调整) - int fragmentSize = 20 * 1024; - - //var numberOfFrames = dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 1); - - var frag = dicomFile.Dataset.GetDicomItem(DicomTag.PixelData); - - int fragmentCount = frag?.Fragments?.Count()??0; - - var originOffsetTable = frag?.OffsetTable; //有可能没有表,需要自己重建 - - var bot = new List(); - - uint botOffset = 0; - - //需要拆成固定片段的 - if (syntax.IsEncapsulated && fragmentCount == pixelData.NumberOfFrames) + if (pixelData != null) { - - - - var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); - - #region test - //var newDicomFile = dicomFile.Clone(); - - //var newDataset = newDicomFile.Dataset; - - //var dstPd = DicomPixelData.Create(newDataset, true); - - //for (int i = 0; i < pixelData.NumberOfFrames; i++) - //{ - // var frame = pixelData.GetFrame(i); - - // dstPd.AddFrame(frame); - - // var data = frame.Data; - // int offset = 0; - - // 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; - - // } - - - //} - //var newOffsetTable = newDataset.GetDicomItem(DicomTag.PixelData).OffsetTable; - - //newFragments.OffsetTable.AddRange(newOffsetTable.ToArray()); - #endregion - - #region test fo-dicom auto bot - //var newDicomFile = dicomFile.Clone(); - - //var newDataset = newDicomFile.Dataset; - - //var dstPd = DicomPixelData.Create(newDataset, true); - - //for (int i = 0; i < pixelData.NumberOfFrames; i++) - //{ - // var frame = pixelData.GetFrame(i); - - // dstPd.AddFrame(frame); - //} - //var newOffsetTable = newDataset.GetDicomItem(DicomTag.PixelData).OffsetTable; - - //Console.WriteLine(newOffsetTable.ToJsonStr()); - #endregion - - #region 暂时废弃 - - for (int n = 0; n < pixelData.NumberOfFrames; n++) + try { - var frameData = pixelData.GetFrame(n); // 获取完整一帧 - var data = frameData.Data; - int offset = 0; - - bot.Add(botOffset); - - botOffset += (uint)data.Length; - while (offset < data.Length) + + var syntax = pixelData.Syntax; + + // 每个 fragment 固定大小 (64KB 示例,可以自己调整) + int fragmentSize = 20 * 1024; + + //var numberOfFrames = dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 1); + + var frag = dicomFile.Dataset.GetDicomItem(DicomTag.PixelData); + + int fragmentCount = frag?.Fragments?.Count() ?? 0; + + var originOffsetTable = frag?.OffsetTable; //有可能没有表,需要自己重建 + + var bot = new List(); + + uint botOffset = 0; + + //需要拆成固定片段的 + if (syntax.IsEncapsulated && fragmentCount == pixelData.NumberOfFrames) { - botOffset += 8; - 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)); + var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); - offset += size; + #region test + //var newDicomFile = dicomFile.Clone(); + //var newDataset = newDicomFile.Dataset; + + //var dstPd = DicomPixelData.Create(newDataset, true); + + //for (int i = 0; i < pixelData.NumberOfFrames; i++) + //{ + // var frame = pixelData.GetFrame(i); + + // dstPd.AddFrame(frame); + + // var data = frame.Data; + // int offset = 0; + + // 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; + + // } + + + //} + //var newOffsetTable = newDataset.GetDicomItem(DicomTag.PixelData).OffsetTable; + + //newFragments.OffsetTable.AddRange(newOffsetTable.ToArray()); + #endregion + + #region test fo-dicom auto bot + //var newDicomFile = dicomFile.Clone(); + + //var newDataset = newDicomFile.Dataset; + + //var dstPd = DicomPixelData.Create(newDataset, true); + + //for (int i = 0; i < pixelData.NumberOfFrames; i++) + //{ + // var frame = pixelData.GetFrame(i); + + // dstPd.AddFrame(frame); + //} + //var newOffsetTable = newDataset.GetDicomItem(DicomTag.PixelData).OffsetTable; + + //Console.WriteLine(newOffsetTable.ToJsonStr()); + #endregion + + #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; + + + while (offset < data.Length) + { + botOffset += 8; + + + 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()); + + //Console.WriteLine(bot.ToJsonStr()); + } + + #endregion + + + dicomFile.Dataset.AddOrUpdate(newFragments); + + + // 重新保存 dicom 到流 + ms.SetLength(0); + + dicomFile.Save(ms); } - } - - //保留原始偏移表 - - if (originOffsetTable.Count == pixelData.NumberOfFrames) - { - newFragments.OffsetTable.AddRange(originOffsetTable.ToArray()); - - } - else - { - newFragments.OffsetTable.AddRange(bot.ToArray()); - - //Console.WriteLine(bot.ToJsonStr()); - } - - #endregion - - - dicomFile.Dataset.AddOrUpdate(newFragments); - - - // 重新保存 dicom 到流 - ms.SetLength(0); - - dicomFile.Save(ms); - } - //传递过来的就是拆分的,但是是没有偏移表的,我需要自己创建偏移表,不然生成缩略图失败 - else if (syntax.IsEncapsulated && fragmentCount > pixelData.NumberOfFrames && originOffsetTable.Count == 0) - { - - - - uint offset = 0; - - bot.Add(offset); - - var fistSize = frag.Fragments.FirstOrDefault()?.Size ?? 0; - - //和上一个大小不一样 - var isDiffrentBefore = false; - - uint count = 0; - - // 假设你知道每帧对应的 fragment 数量 - foreach (var frameFragments in frag.Fragments) - { - count++; - - if (frameFragments.Size == fistSize) + //传递过来的就是拆分的,但是是没有偏移表的,我需要自己创建偏移表,不然生成缩略图失败 + else if (syntax.IsEncapsulated && fragmentCount > pixelData.NumberOfFrames && originOffsetTable.Count == 0) { - isDiffrentBefore = false; - // 累加这一帧所有 fragment 的大小 - offset += (uint)frameFragments.Size; - continue; - } - else - { - offset += (uint)frameFragments.Size; - isDiffrentBefore = true; - } - if (isDiffrentBefore) - { - //每个Fragment 也占用字节 - offset += 8 * count; + + uint offset = 0; + bot.Add(offset); - count = 0; + + var fistSize = frag.Fragments.FirstOrDefault()?.Size ?? 0; + + //和上一个大小不一样 + var isDiffrentBefore = false; + + uint count = 0; + + // 假设你知道每帧对应的 fragment 数量 + foreach (var frameFragments in frag.Fragments) + { + count++; + + if (frameFragments.Size == fistSize) + { + isDiffrentBefore = false; + // 累加这一帧所有 fragment 的大小 + offset += (uint)frameFragments.Size; + continue; + } + else + { + offset += (uint)frameFragments.Size; + isDiffrentBefore = true; + + } + + if (isDiffrentBefore) + { + //每个Fragment 也占用字节 + offset += 8 * count; + bot.Add(offset); + count = 0; + + } + + } + + bot.RemoveAt(bot.Count - 1); + // 设置到新的 PixelData + frag.OffsetTable.AddRange(bot.ToArray()); + + + // 重新保存 DICOM 到流 + ms.SetLength(0); + dicomFile.Save(ms); } } - - bot.RemoveAt(bot.Count - 1); - // 设置到新的 PixelData - frag.OffsetTable.AddRange(bot.ToArray()); - - - // 重新保存 DICOM 到流 - ms.SetLength(0); - dicomFile.Save(ms); - + catch (Exception mutiEx) + { + Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 处理多帧失败,上传原始文件:{mutiEx.ToString()}"); + } } + + #endregion