『QQ:1353814576』

fo-dicom 怎么将图片png合成打包为dcm打印文件


fo-dicom 如何实现将图片png,bmp,jpg合成打包为dicom打印的.dcm文件

之前做得过一个需求 就是通过dicom协议向打印机推送打印,但是打印程序是公司元老遗留的项目 已经没有了源码,

操作打印需要使用dcm文件进行提交 但我这边只有png图片并没有现成的dcm,出于考虑打印软件兼容性问题又不能换打印程序 就需要将png图像合成打包为dicom文件 再进行打印

以下是实现打包的代码:

    /// <summary>
    /// Dicom文件创建器
    /// </summary>
    public class DicomFileBuilder
    {
        private string _ImgFile;

        /// <summary>
        /// 实例化函数
        /// </summary>
        /// <param name="ImgFile">图片文件地址</param>
        public DicomFileBuilder(string ImgFile)
        {
            _ImgFile = ImgFile;
        }

        private byte[] GetPixels(Bitmap pngBitmap)
        {
            byte[] bytes = new byte[pngBitmap.Width * pngBitmap.Height * 3];
            int wide = pngBitmap.Width;
            int i = 0;
            int height = pngBitmap.Height;
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < wide; x++)
                {
                    var srcColor = pngBitmap.GetPixel(x, y);
                    //bytes[i] = (byte)(srcColor.R * .299 + srcColor.G * .587 + srcColor.B * .114);
                    bytes[i] = srcColor.R;
                    i++;
                    bytes[i] = srcColor.G;
                    i++;
                    bytes[i] = srcColor.B;
                    i++;
                }
            }
            return bytes;
        }

        /// <summary>
        /// 获取dcm文件流
        /// </summary>
        /// <returns></returns>
        public Stream Get()
        {
            Stream DcmStream = new MemoryStream();
            using (FileStream PngStream = new FileStream(_ImgFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (Bitmap PngBitmap = new Bitmap(PngStream))
                {
                    //读取图像流
                    byte[] PngPixels = this.GetPixels(PngBitmap);
                    MemoryByteBuffer buffer = new MemoryByteBuffer(PngPixels);

                    DicomDataset PrintDataset = new DicomDataset();

                    PrintDataset.AddOrUpdate(DicomTag.Rows, (ushort)PngBitmap.Height)
                        .AddOrUpdate(DicomTag.Columns, (ushort)PngBitmap.Width)
                        .AddOrUpdate<ushort>(DicomTag.BitsAllocated, 8)
                        .AddOrUpdate<ushort>(DicomTag.BitsStored, 8)
                        .AddOrUpdate(DicomTag.PixelRepresentation, (ushort)PixelRepresentation.Unsigned)
                        .AddOrUpdate(DicomTag.PlanarConfiguration, (ushort)PlanarConfiguration.Interleaved)
                        .AddOrUpdate(DicomTag.HighBit, (ushort)7)
                        .AddOrUpdate(DicomTag.NumberOfCopies, 1)
                        .AddOrUpdate(DicomTag.PrintPriority, "HIGH")
                        .AddOrUpdate(DicomTag.MediumType, "BLUE FILM")
                        .AddOrUpdate(DicomTag.ImageDisplayFormat, "STANDARD\1,1")
                        .AddOrUpdate(DicomTag.FilmOrientation, "PORTRAIT")
                        .AddOrUpdate(DicomTag.FilmSizeID, "14INX17IN")
                        .AddOrUpdate(DicomTag.SOPClassUID, DicomUID.SecondaryCaptureImageStorage)
                        .AddOrUpdate(DicomTag.SOPInstanceUID,"2.25.232605882944094939081727458071427081710");
                   bool IsColor=false;
                    if (IsColor)
                    {
                        //彩色
                        PrintDataset
                        .AddOrUpdate<ushort>(DicomTag.SamplesPerPixel, 3)
                        .AddOrUpdate(DicomTag.PhotometricInterpretation, PhotometricInterpretation.Rgb.Value);
                    }
                    else
                    {  
					//黑白
                        PrintDataset
                       .AddOrUpdate<ushort>(DicomTag.SamplesPerPixel, 1)
                       .AddOrUpdate(DicomTag.PhotometricInterpretation, PhotometricInterpretation.Monochrome2.Value);
                        #region 灰度图合成(黑白)
                        Microsoft.IO.RecyclableMemoryStreamManager msMgr = new Microsoft.IO.RecyclableMemoryStreamManager();
                        if (PngPixels.Length == PngBitmap.Width * PngBitmap.Height * 3)
                        {
                            using (var ms = msMgr.GetStream("AddGray", PngBitmap.Width * PngBitmap.Height))
                            {
                                for (int i = 0; i < PngPixels.Length; i += 3)
                                {
                                    ms.WriteByte(PngPixels[i]);
                                }
                                buffer = new Dicom.IO.Buffer.MemoryByteBuffer(ms.ToArray());
                            }

                        }
                        else if (PngPixels.Length == PngBitmap.Width * PngBitmap.Height)
                        {
                            buffer = new Dicom.IO.Buffer.MemoryByteBuffer(PngPixels);

                        }
                        #endregion
                    }

                    //写入图像
                    DicomPixelData pixelData = DicomPixelData.Create(PrintDataset, true);
                    pixelData.AddFrame(buffer);
                    var DicomItems = PrintDataset.OrderBy<DicomItem, DicomTag>(x => x.Tag);
                    DicomFile dicomfile = new DicomFile(new DicomDataset(DicomItems));
                    dicomfile.FileMetaInfo.TransferSyntax = DicomTransferSyntax.ExplicitVRLittleEndian;
                    dicomfile.FileMetaInfo.SourceApplicationEntityTitle = "printscu";
                    dicomfile.Save(DcmStream);
                    DcmStream.Position = 0;
                }
                return DcmStream;
            }
        }
    }