Загрузите изображение Dicom и отобразите его - используя библиотеку ClearCanvas
Это очень узкий и конкретный вопрос, но я знаю, что кто-то еще использует его, поэтому я буду держать пальцы скрещенными и надеюсь, что кто-нибудь из вас придумает этот вопрос.
Я работаю над приложением WPF, где одна его часть - это программа просмотра Dicom. Мы бы хотели использовать сторонний компонент для работы с Dicom, и именно ClearCanvas мы получили лучшее впечатление от этого. Мы можем загрузить файл Dicom и извлечь атрибуты, но у нас возникают проблемы с размещением данных изображения в свойстве Source элемента управления Image для его отображения. Кто-нибудь с подсказками, как это сделать?
Вот код, который я использую для извлечения данных изображения:
var file = new DicomFile(dicomFilePath);
var patientName = file.DataSet.GetAttribute(DicomTags.PatientsName);
var imageData = file.DataSet.GetAttribute(DicomTags.PixelData);
Также пытались использовать библиотеку ImageViewer, но это все те же данные..
var localSopDataSource = new LocalSopDataSource(new DicomFile(dicomFilePath));
var patientName = localSopDataSource.File.DataSet.GetAttribute(DicomTags.PatientsName);
var imageData = localSopDataSource.File.DataSet.GetAttribute(DicomTags.PixelData);
3 ответа
Хорошо, я понял это. Может быть, есть еще несколько способов достичь этого, но это то, что я сделал. Теперь у меня есть Wpf-изображение, привязанное к свойству, которое предоставляет растровые данные. Ниже приводится свойство, используемое для предоставления растровых данных.
public BitmapSource CurrentFrameData
{
get
{
LocalSopDataSource _dicomDataSource =
new LocalSopDataSource(_dicomFilePath);
var imageSop = new ImageSop(_dicomDataSource);
IPresentationImage presentationImage =
PresentationImageFactory.Create(imageSop.Frames[CurrentFrame]);
int width = imageSop.Frames[CurrentFrame].Columns;
int height = imageSop.Frames[CurrentFrame].Rows;
Bitmap bmp = presentationImage.DrawToBitmap(width, height);
BitmapSource output = Imaging.CreateBitmapSourceFromHBitmap(
bmp.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromWidthAndHeight(width, height));
return output;
}
}
Обратите внимание, что это очень простое решение. Можно, например, захотеть сделать такие вещи, как предварительная загрузка изображений и т. Д., Чтобы избежать большой нагрузки при прокрутке многокадровых изображений. Но на вопрос "как отобразить изображение" - на это следует ответить..
Также проверьте Steve Wranovsky, как он работает в ClearCanvas. Я видел его ответ (и подтверждение об этом) в этом вопросе Stackru.
Хорошо, мне удалось показать изображение DICOM в Picturebox с помощью этого кода:
Вот сборки, которые я использовал:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ClearCanvas.Common;
using ClearCanvas.Dicom;
using System.Windows.Media.Imaging;
using ClearCanvas.ImageViewer;
using ClearCanvas.ImageViewer.StudyManagement;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows;
using System.IO;
Мне также пришлось скопировать эти DLL в bin / debug:
BilinearInterpolation.dll (на этот раз я не могу ссылаться на него как на сборку, поэтому я просто скопировал его в папку bin/degug)
WindowsBase.dll (этот я смог ссылаться на него как на сборку)
Код (в моем проекте есть кнопка, которая позволяет вам выбрать файл dcm, а затем показать его в окне для картинок)
Private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "DICOM Files(*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
if (ofd.FileName.Length > 0)
{
var imagen = new DicomFile(ofd.FileName);
LocalSopDataSource DatosImagen = new LocalSopDataSource(ofd.FileName);
ImageSop imageSop = new ImageSop(DatosImagen);
IPresentationImage imagen_a_mostrar = PresentationImageFactory.Create(imageSop.Frames[1]);
int width = imageSop.Frames[1].Columns;
int height = imageSop.Frames[1].Rows;
Bitmap bmp = imagen_a_mostrar.DrawToBitmap(width, height);
PictureBox1.Image = bmp;
imageOpened = true;
}
ofd.Dispose();
}
}