Created
October 11, 2022 12:11
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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