Пример #1
0
        private void _sendImage(PSImage image, Stream outputStream, BinaryWriter writer)
        {
            var transferSyntax = TransferSyntaxes.Lookup(image.TransferSyntaxID);

            if (transferSyntax.Compression != DICOMSharp.Data.Compression.CompressionInfo.None)
            {
                // Need to decompress
                var data = new DICOMData();
                data.ParseFile(PSUtils.GetParsedFilePath(image.Path), true, PSUtils.GetLogger());
                data.Uncompress();

                var memStream = new MemoryStream();
                data.WriteToStreamAsPart10File(memStream, PSUtils.GetLogger());

                writer.Write((UInt32)(memStream.Length + 4));
                memStream.Position = 0;
                memStream.CopyTo(outputStream);
            }
            else
            {
                // Write the file out directly.
                var fileInfo = new FileInfo(PSUtils.GetParsedFilePath(image.Path));
                var size     = fileInfo.Length;
                writer.Write((UInt32)(size + 4));
                fileInfo.OpenRead().CopyTo(outputStream);
            }
        }
Пример #2
0
        public static void RoundTripAndRender()
        {
            foreach (FileInfo fi in new DirectoryInfo("..\\CompressionSamples").GetFiles("*.dcm"))
            {
                Console.WriteLine("Compression Test -- Filename: " + fi.Name);

                DICOMData data = new DICOMData();
                data.ParseFile(fi.FullName, true, new NullLogger());
                TransferSyntax syntax = data.TransferSyntax;

                int compressedLength = (int)data[DICOMTags.PixelData].GetDataLength(false);

                data.Uncompress();

                Image testImage = DICOMQuickRenderer.QuickRender(data, 0);
                Assert.IsNotNull(testImage);

                int uncompressedLength = (int)data[DICOMTags.PixelData].GetDataLength(false);
                Assert.IsTrue(uncompressedLength > compressedLength);

                if (CompressionWorker.SupportsCompression(syntax.Compression))
                {
                    data.ChangeTransferSyntax(syntax);
                    int recompressedLength = (int)data[DICOMTags.PixelData].GetDataLength(false);
                    Assert.IsTrue(recompressedLength < uncompressedLength);
                }

                //data.WriteFile(fi.FullName.Replace(".dcm", "_un.dcm"));
            }
        }
Пример #3
0
        private void menuItem8_Click(object sender, EventArgs e)
        {
            //Tools/uncompress

            CurDCM.Uncompress();

            RefreshView();
        }
Пример #4
0
        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                DICOMData loadedData = new DICOMData();
                loadedData.ParseFile(openFileDialog1.FileName, true, new NullLogger());
                loadedData.Uncompress();

                if (loadedData.Elements.ContainsKey(DICOMTags.PixelData))
                {
                    viewer.AddImage(loadedData);
                }
            }
        }
Пример #5
0
        private void listener_StoreRequest(DICOMConnection conn, DICOMData data)
        {
            try
            {
                if (!this._settings.StoreMetadataOnlyFiles && !data.Elements.ContainsKey(DICOMTags.PixelData))
                {
                    this._logger.Log(LogLevel.Info, "Data set has no image data (only metadata). Metadata storing is disabled, so image will not be persisted.");
                    conn.SendCSTORERSP(CommandStatus.Error_MissingAttribute);
                    return;
                }

                if (this._settings.AutoDecompress && data.TransferSyntax.Compression != DICOMSharp.Data.Compression.CompressionInfo.None)
                {
                    this._logger.Log(LogLevel.Info, "Image is compressed, decompressing before storage!");
                    if (!data.Uncompress())
                    {
                        this._logger.Log(LogLevel.Warning, "Image decompression failed! Storing compressed image.");
                    }
                }

                string postName = FileUtil.GenerateFilenameFromImage(data, this._logger);

                //form full file path
                string diskPath = _db.FixImagePath(this._settings.ImageStoragePath);
                if (!diskPath.EndsWith("\\"))
                {
                    diskPath += "\\";
                }
                diskPath += postName;

                data.WriteFile(diskPath, this._logger);

                // Db path can save a ~ path, so recalc without MapPath
                string dbPath = this._settings.ImageStoragePath;
                if (!dbPath.EndsWith("\\"))
                {
                    dbPath += "\\";
                }
                dbPath += postName;

                this._db.PersistImage(data, diskPath, dbPath);

                conn.SendCSTORERSP(CommandStatus.Success);
            }
            catch (Exception e)
            {
                this._logger.Log(LogLevel.Error, "Error in StoreRequest: " + e.ToString());
                conn.SendCSTORERSP(CommandStatus.Error_UnrecognizedOperation);
            }
        }
Пример #6
0
        /// <summary>
        /// Sets/changes the DICOMData that the RenderAssistant will be rendering.  Important information about
        /// the image is pre-loaded for faster repeated rendering.
        /// Note: Calling this function does not automatically cause a redraw.
        /// You may also
        /// </summary>
        /// <param name="newData">New DICOMData to draw from (may be null to clear parameters)</param>
        public void SetSource(DICOMData newData)
        {
            if (newData == data)
            {
                return;
            }
            data = newData;

            if (data == null)
            {
                FrameCount = 0;
                return;
            }

            if (!data.Uncompress())
            {
                throw new Exception("Unsupported Compression, can't decompress.");
            }

            if (!data.Elements.ContainsKey(DICOMTags.BitsAllocated))
            {
                throw new MissingMemberException("Missing the Bits Allocated field, can't render.");
            }

            bitsAllocated = (ushort)data.Elements[DICOMTags.BitsAllocated].Data;
            bytes         = (bitsAllocated == 8) ? 1 : 2;

            if (!data.Elements.ContainsKey(DICOMTags.PhotometricInterpretation))
            {
                throw new MissingMemberException("Missing the Photometric Interpretation field, can't render.");
            }

            photoInterp = data.Elements[DICOMTags.PhotometricInterpretation].Display.Trim();
            bFlipMono   = (photoInterp == "MONOCHROME1");
            bRGB        = (photoInterp == "RGB");
            bPalette    = (photoInterp == "PALETTE COLOR");

            if (bPalette)
            {
                if (!data.Elements.ContainsKey(DICOMTags.RedPaletteColorLookupTableData) || !data.Elements.ContainsKey(DICOMTags.GreenPaletteColorLookupTableData) || !data.Elements.ContainsKey(DICOMTags.BluePaletteColorLookupTableData))
                {
                    throw new MissingMemberException("Missing a Palette Lookup field on a PALETTE COLORed image, can't render.");
                }

                palettes = new byte[3][] {
                    (byte[])data.Elements[DICOMTags.RedPaletteColorLookupTableData].Data,
                    (byte[])data.Elements[DICOMTags.GreenPaletteColorLookupTableData].Data,
                    (byte[])data.Elements[DICOMTags.BluePaletteColorLookupTableData].Data
                };

                //PS 3, Page 417-418
                if (!data.Elements.ContainsKey(DICOMTags.RedPaletteColorLookupTableDescriptor) || !data.Elements.ContainsKey(DICOMTags.GreenPaletteColorLookupTableDescriptor) || !data.Elements.ContainsKey(DICOMTags.BluePaletteColorLookupTableDescriptor))
                {
                    throw new MissingMemberException("Missing a Palette Descriptor field on a PALETTE COLORed image, can't render.");
                }
                palette16         = (((ushort[])data.Elements[DICOMTags.RedPaletteColorLookupTableDescriptor].Data)[2] == 16);
                paletteNumEntries = ((ushort[])data.Elements[DICOMTags.RedPaletteColorLookupTableDescriptor].Data)[0];
                if (paletteNumEntries == 0)
                {
                    // Apparently 0 means 65536
                    paletteNumEntries = 65536;
                }
                paletteFirstEntry = ((ushort[])data.Elements[DICOMTags.RedPaletteColorLookupTableDescriptor].Data)[1];
                //figure out supplemental palette color LUT at some point

                if (palette16)
                {
                    // Flip endianness of the palettes
                    palettes16 = new ushort[3][]
                    {
                        new ushort[paletteNumEntries],
                        new ushort[paletteNumEntries],
                        new ushort[paletteNumEntries]
                    };

                    for (int i = 0; i < paletteNumEntries; i++)
                    {
                        palettes16[0][i] = (ushort)(palettes[0][2 * i + 1] | (palettes[0][2 * i] << 8));
                        palettes16[1][i] = (ushort)(palettes[1][2 * i + 1] | (palettes[1][2 * i] << 8));
                        palettes16[2][i] = (ushort)(palettes[2][2 * i + 1] | (palettes[2][2 * i] << 8));
                    }
                }
            }
            else
            {
                palettes   = new byte[3][];
                palettes16 = new ushort[3][];
            }

            bPlanarOne = false;
            if (data.Elements.ContainsKey(DICOMTags.PlanarConfiguration))
            {
                bPlanarOne = ((ushort)data.Elements[DICOMTags.PlanarConfiguration].Data == 1);
            }

            if (!data.Elements.ContainsKey(DICOMTags.ImageWidth))
            {
                throw new MissingMemberException("Missing the Image Width field, can't render.");
            }
            if (!data.Elements.ContainsKey(DICOMTags.ImageHeight))
            {
                throw new MissingMemberException("Missing the Image Height field, can't render.");
            }

            imWidth  = (ushort)data.Elements[DICOMTags.ImageWidth].Data;
            imHeight = (ushort)data.Elements[DICOMTags.ImageHeight].Data;

            signedData = false;
            if (data.Elements.ContainsKey(DICOMTags.PixelRepresentation))
            {
                signedData = Convert.ToInt32(data.Elements[DICOMTags.PixelRepresentation].Data) == 1;
            }

            bRescaling = (data.Elements.ContainsKey(DICOMTags.RescaleIntercept) && data.Elements.ContainsKey(DICOMTags.RescaleSlope));
            adjM       = 1.0f; adjB = 0;
            if (bRescaling)
            {
                adjB = float.Parse((string)data.Elements[DICOMTags.RescaleIntercept].Data);
                adjM = float.Parse((string)data.Elements[DICOMTags.RescaleSlope].Data);
                if (adjB == 0 && adjM == 1.0f)
                {
                    bRescaling = false;
                }
            }

            if (data.Elements.ContainsKey(DICOMTags.PixelIntensityRelationship))
            {
                string intensityRelationship = data.Elements[DICOMTags.PixelIntensityRelationship].Data.ToString().Trim().ToUpperInvariant();
                if (intensityRelationship == "LIN")
                {
                    if (data.Elements.ContainsKey(DICOMTags.PixelIntensityRelationshipSign))
                    {
                        float newAdj = float.Parse(data.Elements[DICOMTags.PixelIntensityRelationshipSign].Data.ToString());
                        if (newAdj == -1)
                        {
                            adjM *= newAdj;

                            ushort bitsStored = (ushort)data.Elements[DICOMTags.BitsStored].Data;
                            if (bitsStored == 16)
                            {
                                adjB += 65536;
                            }
                            else if (bitsStored == 12)
                            {
                                adjB += 4096;
                            }
                            else if (bitsStored == 8)
                            {
                                adjB += 256;
                            }

                            bRescaling = true;
                        }
                    }
                }
            }

            bMultiframe = (data.Elements.ContainsKey(DICOMTags.NumberOfFrames));
            if (bMultiframe)
            {
                FrameCount = int.Parse((string)data.Elements[DICOMTags.NumberOfFrames].Data);
            }
            else
            {
                FrameCount = 1;
            }

            if (!data.Elements.ContainsKey(DICOMTags.PixelData))
            {
                throw new MissingMemberException("Missing the Pixel Data field, can't render.");
            }
            pixelData = data.Elements[DICOMTags.PixelData];
        }
Пример #7
0
        private TaskInfo ImportFromPath(string basePath)
        {
            var taskInfo = new TaskInfo()
            {
                Token = new CancellationTokenSource()
            };

            taskInfo.Task = Task.Run(() =>
            {
                taskInfo.Token.Token.ThrowIfCancellationRequested();

                this._logger.Log(LogLevel.Info, "Importing from Path: " + basePath);

                DirectoryInfo di = new DirectoryInfo(basePath);
                if (!di.Exists)
                {
                    this._logger.Log(LogLevel.Error, "Directory not found!");
                    return;
                }
                else
                {
                    FileUtil.ImageAddedHandler callback = (DICOMData data, string path) =>
                    {
                        taskInfo.ProgressCount++;
                        taskInfo.ProgressTotal++;

                        if (!data.Elements.ContainsKey(DICOMTags.PixelData) && !this._settings.StoreMetadataOnlyFiles)
                        {
                            this._logger.Log(LogLevel.Info, "Data set has no image data (only metadata). Metadata storing is disabled, so image will not be persisted.");
                            return;
                        }

                        if (this._settings.AutoDecompress && data.TransferSyntax.Compression != DICOMSharp.Data.Compression.CompressionInfo.None)
                        {
                            this._logger.Log(LogLevel.Info, "Image is compressed, decompressing in place!");

                            DICOMData fullData = new DICOMData();
                            if (fullData.ParseFile(path, true, this._logger))
                            {
                                if (fullData.Uncompress())
                                {
                                    if (fullData.WriteFile(path, this._logger))
                                    {
                                        // Stuff the new decompressed and written file into the DB instead
                                        data = fullData;
                                    }
                                    else
                                    {
                                        this._logger.Log(LogLevel.Warning, "Failed to write out decompressed file! Storing compressed image.");
                                    }
                                }
                                else
                                {
                                    this._logger.Log(LogLevel.Warning, "Image decompression failed! Storing compressed image.");
                                }
                            }
                            else
                            {
                                this._logger.Log(LogLevel.Warning, "Couldn't parse full image data! Storing compressed image.");
                            }
                        }

                        this._db.PersistImage(data, path, path);
                    };

                    FileUtil.ParseAndLoadImagesFromDirectoryRecursively(di, callback, this._logger, taskInfo.Token.Token);
                }

                this._logger.Log(LogLevel.Info, "Done Importing from Path: " + basePath);
            }, taskInfo.Token.Token);

            return(taskInfo);
        }