Making a copy of the image as displayed
In order to use PrinterImage to make a complete copy of the image as displayed in the viewer, it is necessary to:
- Use a recent copy of DicomObjects (copies prior to 5.6.116.x had a bug in the label handling which distorted images)
- Calculate the size of the area being displayed
- Find the actual zoom of the image as currently displayed
- Scale the current size up to the equivalent in image units (divide by zoom)
- Likewise scale the image's Offset to create correct position for the image in the new rectangle
- Call PrinterImage
Note that the zoom used int he final PrinterImage call does not need to be the same as used above, and a higher quality output can be obtained by setting it to 1 (or higher to allow DicomOBjects to do any interpolation), but that you may wish to modify the font size of any labels to compensate.
In VB.NET
Dim im As DicomImage = viewer.CurrentImage Dim sz As SizeF ' display image area in screen pixels If im.Area = RectangleF.Empty Then ' not using area sz = New SizeF(viewer.Width / viewer.MultiColumns, viewer.Height / viewer.MultiRows) Else sz = New SizeF(viewer.Width * im.Area.Width, viewer.Height * im.Area.Height) End If Dim m As System.Drawing.Drawing2D.Matrix = im.Matrix(viewer) Dim zoom As Single = DicomGlobal.Zoom(m) 'Convert size to image coordinates sz = New SizeF(sz.Width / zoom, sz.Height / zoom) ' make offset to put image in correct location Dim Offset As Point = New Point(-im.Scroll.X / zoom, -im.Scroll.Y / zoom) Dim Canvas As Rectangle = New Rectangle(Offset, Size.Truncate(sz)) Dim FinalCopy as DicomImage = viewer.CurrentImage.PrinterImage(8, 1, True, zoom, Canvas, True)
In C#
DicomImage im = viewer.CurrentImage; SizeF sz; // display image area in screen pixels if(im.Area == RectangleF.Empty) // not using area sz = new SizeF(viewer.Width / viewer.MultiColumns, viewer.Height / viewer.MultiRows); else sz = new SizeF(viewer.Width * im.Area.Width, viewer.Height * im.Area.Height); System.Drawing.Drawing2D.Matrix m = im.Matrix(viewer); float zoom = DicomGlobal.Zoom(m); // Convert size to image coordinates sz = new SizeF(sz.Width / zoom, sz.Height / zoom); // make offset to put image in correct location Point Offset = New Point(-im.Scroll.X / zoom, -im.Scroll.Y / zoom); Rectangle Canvas = New Rectangle(Offset, Size.Truncate(sz)); DicomImage FinalCopy = viewer.CurrentImage.PrinterImage(8, 1, true, zoom, Canvas, true);