简体   繁体   English

如何使用fo-DICOM替换DICOM文件的像素数据?

[英]How to replace the Pixel Data of DICOM file using fo-DICOM?

I want to replace the pixel data of a DICOM file with another one.我想用另一个替换 DICOM 文件的像素数据。 I used this code:我使用了这个代码:

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);
    }
}

The output DICOM file loses many tags which affect image display.输出 DICOM 文件丢失了许多影响图像显示的标签。

I referred to this answer.我参考了这个答案。 But the AddOrUpdatePixelData method used in that answer is deprecated in version v4.0.0-rc1 that I am using.但是在我使用的版本 v4.0.0-rc1 中不推荐使用该答案中使用的AddOrUpdatePixelData方法。 So that answer does not help me.所以这个答案对我没有帮助。

Is there any other way to change the pixel data of a DICOM file using fo-DICOM?有没有其他方法可以使用 fo-DICOM 更改 DICOM 文件的像素数据?

Following code does replace the pixel data correctly.以下代码确实正确替换了像素数据。

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();
    }
}

You can see I have cleaned up your code much.你可以看到我已经清理了很多你的代码。

But the major change is using System.Drawing.Imaging.ImageFormat.Bmp instead of other formats.但主要的变化是使用System.Drawing.Imaging.ImageFormat.Bmp而不是其他格式。 This depends on actual input image format.这取决于实际的输入图像格式。 Use the format as that of input image.使用格式作为输入图像的格式。

For detailed insight, please refer to this source code on github.更详细的见解,请参考github上的这个源代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM