fo-dicom 怎么将图片png合成打包为dcm打印文件
fo-dicom图片转dcmdicom打印图片合成DCM
编程开发
125
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;
}
}
}