重新造bot,方便下载的时候识别具体帧
continuous-integration/drone/push Build is passing Details

Test_HIR_Net8
hang 2025-12-22 17:08:10 +08:00
parent c804bdb5a1
commit 9f060c900f
1 changed files with 56 additions and 8 deletions

View File

@ -478,8 +478,37 @@ namespace IRaCIS.Core.SCP.Service
// 每个 fragment 固定大小 (64KB 示例,可以自己调整) // 每个 fragment 固定大小 (64KB 示例,可以自己调整)
int fragmentSize = 20 * 1024; int fragmentSize = 20 * 1024;
if (syntax.IsEncapsulated) //var numberOfFrames = dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 1);
var frag = dicomFile.Dataset.GetDicomItem<DicomOtherByteFragment>(DicomTag.PixelData);
int fragmentCount = frag.Fragments.Count();
var originOffsetTable = frag.OffsetTable; //有可能没有表,需要自己重建
var bot = new List<uint>();
uint botOffset = 0;
if (syntax.IsEncapsulated && fragmentCount == pixelData.NumberOfFrames)
{ {
//// ① 先复制 Dataset非常关键
//var newDataset = dicomFile.Dataset.Clone();
//// ② 从“旧 dataset”读 PixelData
//var srcPd = DicomPixelData.Create(dicomFile.Dataset);
//// ③ 在“新 dataset”中创建新的 PixelData
//var dstPd = DicomPixelData.Create(newDataset, true);
//// ④ 重建 PixelData自动 BOT
//for (int i = 0; i < srcPd.NumberOfFrames; i++)
//{
// var frame = srcPd.GetFrame(i);
// dstPd.AddFrame(frame);
//}
var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); var newFragments = new DicomOtherByteFragment(DicomTag.PixelData);
for (int n = 0; n < pixelData.NumberOfFrames; n++) for (int n = 0; n < pixelData.NumberOfFrames; n++)
@ -488,6 +517,10 @@ namespace IRaCIS.Core.SCP.Service
var data = frameData.Data; var data = frameData.Data;
int offset = 0; int offset = 0;
bot.Add(botOffset);
botOffset += (uint)data.Length; // 累加帧长度
while (offset < data.Length) while (offset < data.Length)
{ {
int size = Math.Min(fragmentSize, data.Length - offset); int size = Math.Min(fragmentSize, data.Length - offset);
@ -495,10 +528,25 @@ namespace IRaCIS.Core.SCP.Service
Buffer.BlockCopy(data, offset, buffer, 0, size); Buffer.BlockCopy(data, offset, buffer, 0, size);
newFragments.Fragments.Add(new MemoryByteBuffer(buffer)); newFragments.Fragments.Add(new MemoryByteBuffer(buffer));
offset += size; offset += size;
} }
} }
//保留原始偏移表
if (originOffsetTable.Count == pixelData.NumberOfFrames)
{
newFragments.OffsetTable.AddRange(originOffsetTable.ToArray());
}
else
{
newFragments.OffsetTable.AddRange(bot.ToArray());
}
// 替换原 PixelData // 替换原 PixelData
dicomFile.Dataset.AddOrUpdate(newFragments); dicomFile.Dataset.AddOrUpdate(newFragments);
@ -515,13 +563,13 @@ namespace IRaCIS.Core.SCP.Service
#region 本地测试 #region 本地测试
//// --- 保存到本地文件测试 --- // --- 保存到本地文件测试 ---
//var localPath = @"D:\TestDicom.dcm"; var localPath = @"D:\TestDicom-5.dcm";
//using (var fs = new FileStream(localPath, FileMode.Create, FileAccess.Write)) using (var fs = new FileStream(localPath, FileMode.Create, FileAccess.Write))
//{ {
// ms.CopyTo(fs); ms.CopyTo(fs);
//} }
//return new DicomCStoreResponse(request, DicomStatus.Success); return new DicomCStoreResponse(request, DicomStatus.Success);
#endregion #endregion