Ejemplo n.º 1
0
 public DcmImageBox FindImageBox(DicomUID instUid)
 {
     foreach (DcmFilmBox filmBox in _boxes)
     {
         DcmImageBox imageBox = filmBox.FindImageBox(instUid);
         if (imageBox != null)
         {
             return(imageBox);
         }
     }
     return(null);
 }
Ejemplo n.º 2
0
        private void CreateImageBox()
        {
            DicomUID classUid = DicomUID.BasicGrayscaleImageBoxSOPClass;

            if (_session.SessionClassUID == DicomUID.BasicColorPrintManagementMetaSOPClass)
            {
                classUid = DicomUID.BasicColorImageBoxSOPClass;
            }

            DicomUID instUid = DicomUID.Generate(SOPInstanceUID, _boxes.Count + 1);

            DcmImageBox box = new DcmImageBox(this, classUid, instUid);

            box.ImageBoxPosition = (ushort)(_boxes.Count + 1);
            _boxes.Add(box);

            _dataset.AddReferenceSequenceItem(DicomTags.ReferencedImageBoxSequence, classUid, instUid);
        }
Ejemplo n.º 3
0
        private void DrawImageBox(DcmImageBox imageBox, Graphics graphics, Point position, int width, int height, int dpiX, int dpiY)
        {
            DcmDataset dataset = imageBox.ImageSequence;

            if (!dataset.Contains(DicomTags.PixelData))
            {
                return;
            }

            DcmPixelData pixelData = new DcmPixelData(dataset);

            PinnedIntArray pixelBuffer = null;
            Bitmap         bitmap      = null;

            if (pixelData.SamplesPerPixel == 3)
            {
                pixelBuffer = new PinnedIntArray(pixelData.GetFrameDataS32(0));
                bitmap      = new Bitmap(pixelData.ImageWidth, pixelData.ImageHeight,
                                         pixelData.ImageWidth * sizeof(int), PixelFormat.Format32bppRgb, pixelBuffer.Pointer);
            }
            else
            {
                bool invert = (pixelData.PhotometricInterpretation == "MONOCHROME1");
                if (imageBox.Polarity == "REVERSE")
                {
                    invert = !invert;
                }

                byte[] pixelsOut = null;

                if (pixelData.BitsAllocated == 8)
                {
                    pixelsOut = pixelData.GetFrameDataU8(0);
                }
                else
                {
                    ushort[] pixels = pixelData.GetFrameDataU16(0);
                    pixelsOut = new byte[pixels.Length];
                    double scale = 256.0 / 4096.0;

                    int pixel = 0;
                    for (int y = 0; y < pixelData.ImageHeight; y++)
                    {
                        for (int x = 0; x < pixelData.ImageWidth; x++)
                        {
                            pixelsOut[pixel] = (byte)(pixels[pixel] * scale);
                            pixel++;
                        }
                    }

                    pixels = null;
                }

                bitmap = new Bitmap(pixelData.ImageWidth, pixelData.ImageHeight, PixelFormat.Format8bppIndexed);

                if (invert)
                {
                    ColorTable.Apply(bitmap, ColorTable.Monochrome1);
                }
                else
                {
                    ColorTable.Apply(bitmap, ColorTable.Monochrome2);
                }

                BitmapData bmData = bitmap.LockBits(new Rectangle(0, 0, pixelData.ImageWidth, pixelData.ImageHeight),
                                                    ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);

                IntPtr pos = bmData.Scan0;
                for (int i = 0, c = pixelsOut.Length; i < c; i += bmData.Width)
                {
                    Marshal.Copy(pixelsOut, i, pos, bmData.Width);
                    pos = new IntPtr(pos.ToInt64() + bmData.Stride);
                }

                bitmap.UnlockBits(bmData);
            }

            //bitmap.SetResolution(dpiX, dpiY);

            int border = 3;

            double factor = Math.Min((double)height / (double)bitmap.Height,
                                     (double)width / (double)bitmap.Width);

            int drawWidth  = (int)(bitmap.Width * factor) - (border * 2);
            int drawHeight = (int)(bitmap.Height * factor) - (border * 2);

            int drawX = position.X + ((width - drawWidth) / 2);
            int drawY = position.Y + ((height - drawHeight) / 2);

            graphics.DrawImage(bitmap, drawX, drawY, drawWidth, drawHeight);
        }
Ejemplo n.º 4
0
        protected override void OnReceiveNSetRequest(byte presentationID, ushort messageID,
                                                     DicomUID requestedClass, DicomUID requestedInstance, DcmDataset dataset)
        {
            if (requestedClass == DicomUID.BasicFilmSessionSOPClass)
            {
                if (_session == null)
                {
                    Log.Error("{0} -> A Basic Film Session does not exist for this association", LogID);
                    SendAbort(DcmAbortSource.ServiceProvider, DcmAbortReason.NotSpecified);
                    return;
                }

                _session.Dataset.Merge(dataset);

                SendNSetResponse(presentationID, messageID, requestedClass, requestedInstance, null, DcmStatus.Success);
                return;
            }

            if (requestedClass == DicomUID.BasicFilmBoxSOPClass)
            {
                if (_session == null)
                {
                    Log.Error("{0} -> A Basic Film Session does not exist for this association", LogID);
                    SendAbort(DcmAbortSource.ServiceProvider, DcmAbortReason.NotSpecified);
                    return;
                }

                DcmFilmBox box = _session.FindFilmBox(requestedInstance);
                if (box == null)
                {
                    Log.Error("{0} -> Received N-SET request for invalid film box", LogID);
                    SendAbort(DcmAbortSource.ServiceProvider, DcmAbortReason.NotSpecified);
                    return;
                }

                box.Dataset.Merge(dataset);

                SendNSetResponse(presentationID, messageID, requestedClass, requestedInstance, null, DcmStatus.Success);
                return;
            }

            if (requestedClass == DicomUID.BasicColorImageBoxSOPClass ||
                requestedClass == DicomUID.BasicGrayscaleImageBoxSOPClass)
            {
                if (_session == null)
                {
                    Log.Error("{0} -> A Basic Film Session does not exist for this association", LogID);
                    SendAbort(DcmAbortSource.ServiceProvider, DcmAbortReason.NotSpecified);
                    return;
                }

                DcmImageBox box = _session.FindImageBox(requestedInstance);
                if (box == null)
                {
                    Log.Error("{0} -> Received N-SET request for invalid image box", LogID);
                    SendAbort(DcmAbortSource.ServiceProvider, DcmAbortReason.NotSpecified);
                    return;
                }

                box.Dataset.Merge(dataset);

                SendNSetResponse(presentationID, messageID, requestedClass, requestedInstance, null, DcmStatus.Success);
                return;
            }

            SendAbort(DcmAbortSource.ServiceProvider, DcmAbortReason.NotSpecified);
        }
Ejemplo n.º 5
0
		private void DrawImageBox(DcmImageBox imageBox, Graphics graphics, Point position, int width, int height, int dpiX, int dpiY) {
			DcmDataset dataset = imageBox.ImageSequence;
			if (!dataset.Contains(DicomTags.PixelData))
				return;

			DcmPixelData pixelData = new DcmPixelData(dataset);

			PinnedIntArray pixelBuffer = null;
			Bitmap bitmap = null;

			if (pixelData.SamplesPerPixel == 3) {
				pixelBuffer = new PinnedIntArray(pixelData.GetFrameDataS32(0));
				bitmap = new Bitmap(pixelData.ImageWidth, pixelData.ImageHeight,
					pixelData.ImageWidth * sizeof(int), PixelFormat.Format32bppRgb, pixelBuffer.Pointer);
			} else {
                bool invert = (pixelData.PhotometricInterpretation == "MONOCHROME1");
				if (imageBox.Polarity == "REVERSE")
					invert = !invert;

				byte[] pixelsOut = null;

				if (pixelData.BitsAllocated == 8) {					
					pixelsOut = pixelData.GetFrameDataU8(0);
				} else {
                    ushort[] pixels = pixelData.GetFrameDataU16(0);
					pixelsOut = new byte[pixels.Length];
					double scale = 256.0 / 4096.0;

                    int pixel = 0;
                    for (int y = 0; y < pixelData.ImageHeight; y++) {
                        for (int x = 0; x < pixelData.ImageWidth; x++) {
							pixelsOut[pixel] = (byte)(pixels[pixel] * scale);
                            pixel++;
                        }
                    }

					pixels = null;
				}

				bitmap = new Bitmap(pixelData.ImageWidth, pixelData.ImageHeight, PixelFormat.Format8bppIndexed);

				if (invert)
					ColorTable.Apply(bitmap, ColorTable.Monochrome1);
				else
					ColorTable.Apply(bitmap, ColorTable.Monochrome2);

				BitmapData bmData = bitmap.LockBits(new Rectangle(0, 0, pixelData.ImageWidth, pixelData.ImageHeight),
					ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);

				IntPtr pos = bmData.Scan0;
				for (int i = 0, c = pixelsOut.Length; i < c; i += bmData.Width) {
					Marshal.Copy(pixelsOut, i, pos, bmData.Width);
					pos = new IntPtr(pos.ToInt64() + bmData.Stride);
				}

				bitmap.UnlockBits(bmData);
			}

			//bitmap.SetResolution(dpiX, dpiY);

			int border = 3;

			double factor = Math.Min((double)height / (double)bitmap.Height,
									 (double)width / (double)bitmap.Width);

			int drawWidth = (int)(bitmap.Width * factor) - (border * 2);
			int drawHeight = (int)(bitmap.Height * factor) - (border * 2);

			int drawX = position.X + ((width - drawWidth) / 2);
			int drawY = position.Y + ((height - drawHeight) / 2);

			graphics.DrawImage(bitmap, drawX, drawY, drawWidth, drawHeight);
		}
Ejemplo n.º 6
0
		private void CreateImageBox() {
			DicomUID classUid = DicomUID.BasicGrayscaleImageBoxSOPClass;
			if (_session.SessionClassUID == DicomUID.BasicColorPrintManagementMetaSOPClass)
				classUid = DicomUID.BasicColorImageBoxSOPClass;

			DicomUID instUid = DicomUID.Generate(SOPInstanceUID, _boxes.Count + 1);

			DcmImageBox box = new DcmImageBox(this, classUid, instUid);
			box.ImageBoxPosition = (ushort)(_boxes.Count + 1);
			_boxes.Add(box);

			_dataset.AddReferenceSequenceItem(DicomTags.ReferencedImageBoxSequence, classUid, instUid);
		}