修改HIR 接收影像
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
b95cc97f55
commit
72d7136f1c
|
|
@ -473,199 +473,216 @@ namespace IRaCIS.Core.SCP.Service
|
||||||
var dicomFile = DicomFile.Open(ms);
|
var dicomFile = DicomFile.Open(ms);
|
||||||
|
|
||||||
var pixelData = DicomPixelData.Create(dicomFile.Dataset);
|
var pixelData = DicomPixelData.Create(dicomFile.Dataset);
|
||||||
var syntax = pixelData.Syntax;
|
|
||||||
|
|
||||||
// 每个 fragment 固定大小 (64KB 示例,可以自己调整)
|
if (pixelData != null)
|
||||||
int fragmentSize = 20 * 1024;
|
|
||||||
|
|
||||||
//var numberOfFrames = dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 1);
|
|
||||||
|
|
||||||
var frag = dicomFile.Dataset.GetDicomItem<DicomOtherByteFragment>(DicomTag.PixelData);
|
|
||||||
|
|
||||||
int fragmentCount = frag?.Fragments?.Count()??0;
|
|
||||||
|
|
||||||
var originOffsetTable = frag?.OffsetTable; //有可能没有表,需要自己重建
|
|
||||||
|
|
||||||
var bot = new List<uint>();
|
|
||||||
|
|
||||||
uint botOffset = 0;
|
|
||||||
|
|
||||||
//需要拆成固定片段的
|
|
||||||
if (syntax.IsEncapsulated && fragmentCount == pixelData.NumberOfFrames)
|
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
|
||||||
|
|
||||||
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<DicomOtherByteFragment>(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<DicomOtherByteFragment>(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)
|
|
||||||
|
var syntax = pixelData.Syntax;
|
||||||
|
|
||||||
|
// 每个 fragment 固定大小 (64KB 示例,可以自己调整)
|
||||||
|
int fragmentSize = 20 * 1024;
|
||||||
|
|
||||||
|
//var numberOfFrames = dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 1);
|
||||||
|
|
||||||
|
var frag = dicomFile.Dataset.GetDicomItem<DicomOtherByteFragment>(DicomTag.PixelData);
|
||||||
|
|
||||||
|
int fragmentCount = frag?.Fragments?.Count() ?? 0;
|
||||||
|
|
||||||
|
var originOffsetTable = frag?.OffsetTable; //有可能没有表,需要自己重建
|
||||||
|
|
||||||
|
var bot = new List<uint>();
|
||||||
|
|
||||||
|
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<DicomOtherByteFragment>(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<DicomOtherByteFragment>(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);
|
||||||
}
|
}
|
||||||
}
|
//传递过来的就是拆分的,但是是没有偏移表的,我需要自己创建偏移表,不然生成缩略图失败
|
||||||
|
else if (syntax.IsEncapsulated && fragmentCount > pixelData.NumberOfFrames && originOffsetTable.Count == 0)
|
||||||
//保留原始偏移表
|
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
isDiffrentBefore = false;
|
|
||||||
// 累加这一帧所有 fragment 的大小
|
|
||||||
offset += (uint)frameFragments.Size;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
offset += (uint)frameFragments.Size;
|
|
||||||
isDiffrentBefore = true;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isDiffrentBefore)
|
|
||||||
{
|
uint offset = 0;
|
||||||
//每个Fragment 也占用字节
|
|
||||||
offset += 8 * count;
|
|
||||||
bot.Add(offset);
|
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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
catch (Exception mutiEx)
|
||||||
bot.RemoveAt(bot.Count - 1);
|
{
|
||||||
// 设置到新的 PixelData
|
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 处理多帧失败,上传原始文件:{mutiEx.ToString()}");
|
||||||
frag.OffsetTable.AddRange(bot.ToArray());
|
}
|
||||||
|
|
||||||
|
|
||||||
// 重新保存 DICOM 到流
|
|
||||||
ms.SetLength(0);
|
|
||||||
dicomFile.Save(ms);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue