2012-10-22 17 views
6

Nie jestem doświadczonym programistą, wystarczy dodać przeglądarkę DICOM do mojego projektu VS2010. Mogę wyświetlić obraz w Windows Forms, jednak nie mogę dowiedzieć się, jak zmienić środek i szerokość okna. Oto mój skrypt:Fellow Oak DICOM - zmiana poziomu okna obrazu

DicomImage image = new DicomImage(_filename); 
      int maxV = image.NumberOfFrames; 
      sbSlice.Maximum = maxV - 1; 
      image.WindowCenter = 7.0; 
      double wc = image.WindowCenter; 
      double ww = image.WindowWidth; 

      Image result = image.RenderImage(0); 
      DisplayImage(result); 

To nie zadziałało. Nie wiem, czy to właściwe podejście.

+0

Czy możesz nieco lepiej zrozumieć, z której biblioteki DICOM korzystasz? –

+0

Używam Fellow Oak DICOM dla .NET, dzięki. – hncl

+1

Zauważyłem, że wysłałeś to samo pytanie na forum dyskusyjnym * fo-dicom * i otrzymałeś odpowiedź, że w wersji oprogramowania, z której korzystasz, jest błąd na poziomie okna. Aby uzyskać spójność w * Stackoverflow *, dobrym pomysłem byłoby dostarczenie tutaj własnej odpowiedzi na podstawie odpowiedzi forum, a także wskazanie w pytaniu, że używasz * fo-dicom * version 1.0.26. –

Odpowiedz

1

Spojrzałem na kod i wyglądało na bardzo błędne. https://github.com/rcd/fo-dicom/blob/master/DICOM/Imaging/DicomImage.cs

W obecnej implementacji buggy ustalające WindowCenter lub WindowWidth właściwości nie ma wpływu, chyba Dataset.Get (DicomTag.PhotometricInterpretation) jest albo Monochrome1 lub Monochrome2 podczas Load(). To już jest śmieszne, ale nadal nie można go użyć, ponieważ zmienna _renderOptions jest ustawiona tylko w jednym miejscu i jest natychmiast używana do tworzenia _pipeline (nie dając szansy na jej zmianę przy użyciu właściwości WindowCenter). Twoja jedyna szansa to inicjalizacja w skali szarości _renderOptions: .

Obecne rozwiązanie: Twój zbiór danych powinien mieć

  • DicomTag.WindowCenter odpowiednio ustawione
  • DicomTag.WindowWidth != 0.0
  • DicomTag.PhotometricInterpretation == Monochrome1 lub Monochrome2

Poniższy kod realizuje że:

DicomDataset dataset = DicomFile.Open(fileName).Dataset; 
//dataset.Set(DicomTag.WindowWidth, 200.0); //the WindowWidth must be non-zero 
dataset.Add(DicomTag.WindowCenter, "100.0"); 
//dataset.Add(DicomTag.PhotometricInterpretation, "MONOCHROME1"); //ValueRepresentations tag is broken 
dataset.Add(new DicomCodeString(DicomTag.PhotometricInterpretation, "MONOCHROME1")); 
DicomImage image = new DicomImage(dataset); 
image.RenderImage(); 

Najlepsze rozwiązanie: Zaczekaj, aż ta błędna biblioteka zostanie naprawiona.

+0

Dziękujemy za poświęcenie czasu, zawęziliśmy problem w klasie DicomDataset w następującym kodzie: if (typeof (T) == typeof (dziesiętny)) return Add (new DicomDecimalString (tag, values.Cast () .ToArray())); Błąd jest "Nie można utworzyć elementu DICOM typu DS z wartościami typu System.Int32" Opublikowałem to w grupie google. Ogólnie znalazłem fo-Dicom za jedną z lepszych bibliotek, zmęczony innymi zestawami narzędzi bez większego szumu. – hncl

+0

Dlaczego uważasz, że to jest źródło problemu? Czy masz gdzieś miejsca dziesiętne? Jeśli kod opublikowany w pytaniu działa, myślę, że mogę napisać kod, aby WindowsCenter działał. P.S. Czy Twoje obrazy są w skali szarości? –

+0

Obrazy są w skali szarości. Oto link do mojego obejścia w celu rozwiązania problemu: https://groups.google.com/forum/?fromgroups=#!topic/fo-dicom/ycnB25bAvq4. Dzięki – hncl

5

Klasa DicomImage nie została utworzona z zamiarem wykorzystania jej do zaimplementowania przeglądarki obrazów. Został stworzony do renderowania obrazów podglądu w narzędziu DICOM Dump i testowania kodeków kompresji/dekompresji obrazu. Może błędem było włączenie go do biblioteki?

Trudno mi znaleźć błąd w kodzie jako błąd, gdy jest używany do czegoś znacznie wykraczającego poza jego przeznaczoną funkcję.

To powiedziawszy, zajęło mi trochę czasu, aby zmodyfikować kod, aby właściwości WindowCenter/WindowWidth miały zastosowanie do renderowanego obrazu. Te modyfikacje można znaleźć w repozytorium Git.

var img = new DicomImage(fileName); 
img.WindowCenter = 2048.0; 
img.WindowWidth = 4096.0; 
DisplayImage(img.RenderImage(0)); 
+1

Dzięki Colby, bardzo doceniane. Masz rację, próbowałem korzystać z biblioteki w celu przedłużenia funkcji; Bez wątpienia wynika to z mojego ograniczonego doświadczenia z DICOM. Jeszcze raz dziękuję za wysiłek. – hncl