Skip to content

Instantly share code, notes, and snippets.

@amoerie
Created October 11, 2022 12:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amoerie/39fd071ef783ef7edec2b6ce19e0928d to your computer and use it in GitHub Desktop.
Save amoerie/39fd071ef783ef7edec2b6ce19e0928d to your computer and use it in GitHub Desktop.
Modify pixel data of an existing DICOM file by writing some text over it using ImageSharp
using DcmPixelData;
using FellowOakDicom;
using FellowOakDicom.Imaging;
using FellowOakDicom.Imaging.NativeCodec;
using FellowOakDicom.IO.Buffer;
using SixLabors.Fonts;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.PixelFormats;
// Configure SixLabors Fonts
var fontCollection = new FontCollection();
fontCollection.Add("Roboto-Regular.ttf");
var fontFamily = fontCollection.Get("Roboto");
var font = fontFamily.CreateFont(36, FontStyle.Bold);
// Configure Fellow Oak DICOM
new DicomSetupBuilder().RegisterServices(x =>
{
x.AddFellowOakDicom();
x.AddImageManager<ImageSharpImageManager>();
x.AddTranscoderManager<NativeTranscoderManager>();
}).Build();
var directory = @"C:\Users\a.moerman\Downloads\DOPA-3608\St1b";
var files = Directory.EnumerateFiles(directory);
foreach (var adaptedFile in Directory.EnumerateFiles(directory, "*-lic.dcm"))
{
Console.WriteLine("Deleting " + adaptedFile);
File.Delete(adaptedFile);
}
foreach (var file in files)
{
var dicomFile = DicomFile.Open(file);
var frame = 0;
var dicomImage = new DicomImage(dicomFile.Dataset) { OverlayColor = 0xFFFFFF };
Console.WriteLine("Rendering " + file);
using var imageSharpImage = (dicomImage.RenderImage(frame) as ImageSharpImage)!;
// dicomFile.Save(dicomFile.File.Name.Replace(".dcm", "-adapted.dcm"));
using Image image = imageSharpImage.RenderedImage.CloneAs<L16>()!;
image.Mutate(x =>
{
x.DrawText("LOCAL IMAGE CACHE", font, Color.White, new PointF(10, 10));
});
using var ms = new MemoryStream();
image.Save(ms, new RawEncoder());
var dicomPixelData = DicomPixelData.Create(dicomFile.Dataset, true);
dicomPixelData.AddFrame(new MemoryByteBuffer(ms.ToArray()));
dicomFile.Dataset.AddOrUpdate(DicomTag.PhotometricInterpretation, PhotometricInterpretation.Monochrome2.Value);
dicomFile.Dataset.AddOrUpdate(DicomTag.BitsAllocated, (ushort)16);
dicomFile.Dataset.AddOrUpdate(DicomTag.BitsStored, (ushort)16);
dicomFile.Dataset.AddOrUpdate(DicomTag.HighBit, (ushort)15);
dicomFile.Dataset.AddOrUpdate(DicomTag.RescaleSlope, (decimal)1.0);
dicomFile.Dataset.AddOrUpdate(DicomTag.RescaleIntercept, (decimal)0);
dicomFile.Dataset.AddOrUpdate(DicomTag.WindowWidth, (decimal)ushort.MaxValue);
dicomFile.Dataset.AddOrUpdate(DicomTag.WindowCenter, (decimal)(ushort.MaxValue - 1) / 2);
dicomFile.Dataset.AddOrUpdate(DicomTag.SamplesPerPixel, (ushort)1);
var adaptedFileName = dicomFile.File.Name.Replace(".dcm", "-lic.dcm");
Console.WriteLine("Writing " + adaptedFileName);
dicomFile.Save(adaptedFileName);
Console.WriteLine("Done");
}
Console.WriteLine("All done");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment