using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using ClearCanvas.Common; using ClearCanvas.Common.Utilities; using ClearCanvas.Desktop; using ClearCanvas.Desktop.Actions; using ClearCanvas.Dicom; using ClearCanvas.ImageViewer; using ClearCanvas.ImageViewer.BaseTools; using ClearCanvas.ImageViewer.Graphics; using ClearCanvas.ImageViewer.PresentationStates.Dicom; using ClearCanvas.ImageViewer.StudyManagement; using Path=System.IO.Path; namespace Nullstack.ClearCanvas.ImageViewerTools { [MenuAction("activate", "global-menus/mnDebug/mnImageViewer/mnDumpOverlays", "Activate")] //[MenuAction("activateraw", "global-menus/mnDebug/RawDump", "ActivateRaw")] [ExtensionOf(typeof (ImageViewerToolExtensionPoint))] public class BitmapDumpTool : ImageViewerTool { public void Activate() { FileDialogResult fdr = base.Context.DesktopWindow.ShowSelectFolderDialogBox(new SelectFolderDialogCreationArgs()); if (fdr.Action != DialogBoxAction.Ok) return; DicomGraphicsPlane dpi = DicomGraphicsPlane.GetDicomGraphicsPlane(base.SelectedPresentationImage as IDicomPresentationImage, false); if(dpi != null) { foreach (ILayer layer in (IEnumerable)dpi.Layers) { foreach (OverlayPlaneGraphic plane in CollectionUtils.Select(layer.Graphics, IsGraphic)) { GrayscaleImageGraphic gig = CollectionUtils.SelectFirst(plane.Graphics, IsGraphic) as GrayscaleImageGraphic; if(gig != null) { string filename = Path.Combine(fdr.FileName, string.Format("{0}.png", string.Join("", plane.Name.Split(Path.GetInvalidFileNameChars())))); DumpOverlayToBitmap(filename, gig); } } } } } public void ActivateRaw() { FileDialogResult fdr = base.Context.DesktopWindow.ShowSelectFolderDialogBox(new SelectFolderDialogCreationArgs()); if (fdr.Action != DialogBoxAction.Ok) return; DicomGraphicsPlane dpi = DicomGraphicsPlane.GetDicomGraphicsPlane(base.SelectedPresentationImage as IDicomPresentationImage, false); if (dpi != null) { foreach (ILayer layer in (IEnumerable)dpi.Layers) { foreach (OverlayPlaneGraphic plane in CollectionUtils.Select(layer.Graphics, IsGraphic)) { GrayscaleImageGraphic gig = CollectionUtils.SelectFirst(plane.Graphics, IsGraphic) as GrayscaleImageGraphic; if (gig != null) { string filename = Path.Combine(fdr.FileName, string.Format("{0}.raw", string.Join("", plane.Name.Split(Path.GetInvalidFileNameChars())))); DumpOverlayToRaw(filename, gig); } } } } } protected static bool IsGraphic(IGraphic test) where T : IGraphic { return test is T; } protected static void DumpOverlayToRaw(string filename, ImageGraphic graphic) { if (graphic is GrayscaleImageGraphic) { int length = graphic.SizeInPixels; byte[] data = graphic.PixelData.Raw; Stream s = File.OpenWrite(filename); s.Write(data, 0, data.Length); s.Flush(); s.Close(); s.Dispose(); } else { throw new NotSupportedException(); } } protected static void DumpOverlayToBitmap(string filename, ImageGraphic graphic) { if (graphic is GrayscaleImageGraphic) { int length = graphic.SizeInPixels; Bitmap bmp = new Bitmap(graphic.Columns, graphic.Rows, PixelFormat.Format32bppArgb); for (int n = 0; n < length; n++) { int x = n%graphic.Columns; int y = n/graphic.Columns; bmp.SetPixel(x, y, graphic.PixelData.Raw[n] > 0 ? Color.PeachPuff : Color.Black); } bmp.Save(filename, ImageFormat.Png); bmp.Dispose(); } else { throw new NotSupportedException(); } } } }