123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- using SkiaSharp;
- using Dicom.Imaging;
- using Vinno.vCloud.Common.Vid2;
- using Vinno.vCloud.Common.Vid2.Visuals;
- using System.Runtime.InteropServices;
- using Dicom;
- namespace VidProcessService.Utilities
- {
- public class VidFile : IDisposable
- {
- private const int DefaultFrameRate = 0;
- private readonly VinnoImageData _vinnoImageData;
- public DicomFrameInfo DicomFrameInfo;
- private int index = 0;
- public VidFile(string targetPath)
- {
- _vinnoImageData = new VinnoImageData(targetPath, OperationMode.Create);
- }
- public void AddImages(DicomImage dicomImage)
- {
- var encoder = new VinnoImageEncoder();
- for (int i = 0; i < dicomImage.NumberOfFrames; i++)
- {
- using (IImage image = dicomImage.RenderImage(i))
- {
- var bytes = image.As<byte[]>();
- using (MemoryStream ms = new MemoryStream(bytes))
- {
- using (var skiaBitmap = new SKBitmap(dicomImage.Width, dicomImage.Height))
- {
- var imagePtr = Marshal.AllocHGlobal(bytes.Length);
- Marshal.Copy(bytes, 0, imagePtr, bytes.Length);
- skiaBitmap.SetPixels(imagePtr);
- // var bytes1 = skiaBitmap.Encode(SKEncodedImageFormat.Jpeg, 100).ToArray();
- var vinnoImage = encoder.Encode(skiaBitmap);
- if (i == 0)
- {
- DicomFrameInfo.DicomFirstFrameData = vinnoImage.ImageData;
- DicomFrameInfo.FrameCount = dicomImage.NumberOfFrames;
- }
- index++;
- var visual = new Vinno2DVisual();
- visual.Modes.Add(new VinnoMode("HAR", "HAR", VinnoModeType.Tissue));
- visual.ActiveModeType = VinnoModeType.Tissue;
- var physicalCoordinateInfo = new VinnoLinearTVTissuePhysicalCoordinate(1, 0, 1, 0, 0);
- var logicalCoordinateInfo = new VinnoLogicalCoordinate(false, false,
- new VinnoRect(0, 0, 1, 1), VinnoUnit.None, VinnoUnit.None);
- visual.PhysicalCoordinates.Add(VinnoVisualAreaType.Tissue, physicalCoordinateInfo);
- visual.LogicalCoordinates.Add(VinnoVisualAreaType.Tissue, logicalCoordinateInfo);
- vinnoImage.Visuals.Add(visual);
- _vinnoImageData.AddImage(vinnoImage);
- }
- }
- }
- }
- }
- /// <summary>
- /// Add probe.
- /// </summary>
- /// <param name="dataSet">Dicom dataset</param>
- public void AddProbe(DicomDataset dataSet)
- {
- var frame = GetFrameRate(dataSet);
- var probe = new VinnoProbe("ThirdPart", VinnoProbeType.Linear, new VinnoApplication("ThirdPart", string.Empty, "ThirdPart", "ThirdPart", false), frame);
- _vinnoImageData.AddProbe(probe);
- }
- /// <summary>
- /// Add probe.
- /// </summary>
- /// <param name="dataSet">Dicom dataset</param>
- public void AddProbe(int frame)
- {
- var probe = new VinnoProbe("ThirdPart", VinnoProbeType.Linear, new VinnoApplication("ThirdPart", string.Empty, "ThirdPart", "ThirdPart", false), frame);
- _vinnoImageData.AddProbe(probe);
- }
- public void AddImages(int Width, int Height, byte[] e)
- {
- if (e == null || e.Length <= 0)
- {
- return;
- }
- if (Width <= 0 || Height <= 0)
- {
- return;
- }
- VinnoImage vinnoImage = new VinnoImage(index, Width, Height, e);
- index++;
- var visual = new Vinno2DVisual();
- visual.Modes.Add(new VinnoMode("HAR", "HAR", VinnoModeType.Tissue));
- visual.ActiveModeType = VinnoModeType.Tissue;
- var physicalCoordinateInfo = new VinnoLinearTVTissuePhysicalCoordinate(1, 0, 1, 0, 0);
- var logicalCoordinateInfo = new VinnoLogicalCoordinate(false, false,
- new VinnoRect(0, 0, 1, 1), VinnoUnit.None, VinnoUnit.None);
- visual.PhysicalCoordinates.Add(VinnoVisualAreaType.Tissue, physicalCoordinateInfo);
- visual.LogicalCoordinates.Add(VinnoVisualAreaType.Tissue, logicalCoordinateInfo);
- vinnoImage.Visuals.Add(visual);
- _vinnoImageData.AddImage(vinnoImage);
- }
- /// <summary>
- /// Add extended data.
- /// </summary>
- /// <param name="dataSet">Dicom dataset.</param>
- public void AddExtendedData(DicomDataset dataSet)
- {
- var extendedData = VinnoExtendedDataGenerator.Generate(dataSet);
- _vinnoImageData.ExtendedData = extendedData.ToBytes();
- }
- public void Dispose()
- {
- _vinnoImageData.Dispose();
- }
- private static int GetFrameRate(DicomDataset dataSet)
- {
- if (dataSet.Contains(DicomTag.CineRate))
- {
- var cineRate = dataSet.GetSingleValue<int>(DicomTag.CineRate);
- if (cineRate > 0)
- {
- return cineRate;
- }
- }
- if (dataSet.Contains(DicomTag.RecommendedDisplayFrameRate))
- {
- var recommendedDisplayFrameRate = dataSet.GetSingleValue<int>(DicomTag.RecommendedDisplayFrameRate);
- return recommendedDisplayFrameRate > 0 ? recommendedDisplayFrameRate : DefaultFrameRate;
- }
- return 1;
- }
- }
- public struct DicomFrameInfo
- {
- public object DicomFirstFrameData;
- public int FrameCount;
- }
- }
|