如何使用fo-dicom更改DICOM文件的像素数据?

时间:2018-11-01 07:06:02

标签: c# dicom fo-dicom

我想用另一个替换DICOM文件的像素数据。我使用了这段代码:

public bool ImportImage(string imageFile, string newFilePah, string oldDicomFile)
{
    try
    {
        Bitmap bitmap = new Bitmap(imageFile);
        bitmap = GetValidImage(bitmap);
        int rows, columns;
        byte[] pixels = GetPixels(bitmap, out rows, out columns);
        MemoryByteBuffer buffer = new MemoryByteBuffer(pixels);
        DicomDataset dataset = new DicomDataset();
        var df = DicomFile.Open(oldDicomFile);
        FillDataset(ref dataset, df);

        DicomTransferSyntax dicomTransfer = df.Dataset.Get<DicomTransferSyntax>(DicomTag.TransferSyntaxUID, DicomTransferSyntax.JPEGProcess14);
        dataset.AddOrUpdate(DicomTag.PhotometricInterpretation, PhotometricInterpretation.Rgb.Value);
        dataset.AddOrUpdate(DicomTag.Rows, (ushort)rows);
        dataset.AddOrUpdate(DicomTag.Columns, (ushort)columns);
        dataset.AddOrUpdate(DicomTag.BitsAllocated, (ushort)8);
        DicomPixelData pixelData = DicomPixelData.Create(dataset, true);
        pixelData.BitsStored = 8;
        pixelData.SamplesPerPixel = 3;
        pixelData.HighBit = 7;
        pixelData.PixelRepresentation = 0;
        pixelData.PlanarConfiguration = 0;
        pixelData.AddFrame(buffer);

        DicomFile dicomfile = new DicomFile(dataset.Clone(dicomTransfer));
        dicomfile.Save(newFilePah);
        return true;
    }
    catch(Exception ddd) { return false; }
}
private void FillDataset(ref DicomDataset dataset, DicomFile df)
{
    foreach(var item in df.Dataset)
    {
        if(!item.Tag.Group.ToString().Equals("7FE0") && !item.Tag.Group.ToString().Equals("40"))
            dataset.Add(item);
    }
}

输出的DICOM文件丢失了许多会影响图像显示的标签。

我提到了this答案。但是该答案中使用的AddOrUpdatePixelData方法在v4.0.0-rc1版本中已弃用。因此,该答案没有太大帮助。

还有其他方法可以使用fo-dicom更改DICOM文件的像素数据吗?

1 个答案:

答案 0 :(得分:0)

以下代码确实正确替换了像素数据。

public static bool ImportImage(string imageFile, string newFilePah, string oldDicomFile)
{
    Bitmap bitmap = new Bitmap(imageFile);
    int rows, columns;
    byte[] pixels = GetPixels(bitmap, out rows, out columns);
    MemoryByteBuffer buffer = new MemoryByteBuffer(pixels);
    DicomDataset dataset = new DicomDataset();
    var dicomfile = DicomFile.Open(oldDicomFile);
    dataset = dicomfile.Dataset.Clone();

    dataset.AddOrUpdate(DicomTag.PhotometricInterpretation, PhotometricInterpretation.Rgb.Value);
    dataset.AddOrUpdate(DicomTag.Rows, (ushort)rows);
    dataset.AddOrUpdate(DicomTag.Columns, (ushort)columns);
    dataset.AddOrUpdate(DicomTag.BitsAllocated, (ushort)8);

    DicomPixelData pixelData = DicomPixelData.Create(dataset, true);
    pixelData.BitsStored = 8;
    pixelData.SamplesPerPixel = 3;
    pixelData.HighBit = 7;
    pixelData.PhotometricInterpretation = PhotometricInterpretation.Rgb;
    pixelData.PixelRepresentation = 0;
    pixelData.PlanarConfiguration = 0;
    pixelData.Height = (ushort)rows;
    pixelData.Width = (ushort)columns;
    pixelData.AddFrame(buffer);

    dicomfile = new DicomFile(dataset);
    dicomfile.Save(newFilePah);
    return true;
}

private static byte[] GetPixels(Bitmap bitmap, out int rows, out int columns)
{
    using(var stream = new MemoryStream())
    {
        bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
        rows = bitmap.Height;
        columns = bitmap.Width;
        return stream.ToArray();
    }
}

您可以看到我已经清理了很多代码。

但是主要的变化是使用System.Drawing.Imaging.ImageFormat.Bmp而不是其他格式。这取决于实际的输入图像格式。使用与输入图像相同的格式。