/*========================================================================= Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2011 Mathieu Malaterre All rights reserved. See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /* * This small code shows how to use the gdcm.ImageRegionReader API * In this example we are taking each frame by frame and dump them to * /tmp/frame.raw. * Furthermore we are applying the LUT on this image. * Special care should be taken in case the image is not PALETTE COLOR * * Usage: * $ bin/ExtractImageRegionWithLUT.exe input.dcm * * Example: * $ bin/ExtractImageRegionWithLUT.exe gdcmData/rle16loo.dcm * $ md5sum /tmp/frame_rgb.raw * 73bf61325fdb6e2830244a2b7b0c4ae2 /tmp/frame_rgb.raw * $ gdcmimg --depth 16 --spp 3 --size 600,430 /tmp/frame_rgb.raw rgb.dcm * $ gdcmviewer rgb.dcm */ using System; using gdcm; public class ExtractImageRegion { public static int Main(string[] args) { string filename = args[0]; // instantiate the reader: gdcm.ImageRegionReader reader = new gdcm.ImageRegionReader(); reader.SetFileName( filename ); // pull DICOM info: if (!reader.ReadInformation()) return 1; // Get file infos gdcm.File f = reader.GetFile(); gdcm.LookupTable lut = reader.GetImage().GetLUT(); // get some info about image UIntArrayType dims = ImageHelper.GetDimensionsValue(f); PixelFormat pf = ImageHelper.GetPixelFormatValue (f); int pixelsize = pf.GetPixelSize(); // buffer to get the pixels byte[] buffer = new byte[ dims[0] * dims[1] * pixelsize ]; // output buffer for the RGB decoded image: byte[] buffer2 = new byte[ dims[0] * dims[1] * pixelsize * 3 ]; // define a simple box region. BoxRegion box = new BoxRegion(); for (uint z = 0; z < dims[2]; z++) { // Define that I want the image 0, full size (dimx x dimy pixels) // and do that for each z: box.SetDomain(0, dims[0] - 1, 0, dims[1] - 1, z, z); //System.Console.WriteLine( box.toString() ); reader.SetRegion( box ); // reader will try to load the uncompressed image region into buffer. // the call returns an error when buffer.Length is too small. For instance // one can call: // uint buf_len = reader.ComputeBufferLength(); // take into account pixel size // to get the exact size of minimum buffer if (reader.ReadIntoBuffer(buffer, (uint)buffer.Length)) { if( !lut.Decode( buffer2, (uint)buffer2.Length, buffer, (uint)buffer.Length ) ) { throw new Exception("can't decode"); } using (System.IO.Stream stream = System.IO.File.Open(@"/tmp/frame_rgb.raw", System.IO.FileMode.Create)) { System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream); writer.Write(buffer2); } } else { throw new Exception("can't read pixels error"); } } return 0; } }