<div dir="ltr">Based on ImageColorViewer of InsightApplications I adapted the code to visualice a dicom rgb serie with 2D slices. The code, named DicomSeriesColorViewer, looks like:<br><br>#include &lt;iostream&gt;
<br>&nbsp;<br>#include &quot;itkImage.h&quot;
<br>#include &quot;itkRGBPixel.h&quot;
<br>#include &quot;itkImageSeriesReader.h&quot;
<br>#include &quot;itkGDCMImageIO.h&quot;
<br>#include &quot;itkGDCMSeriesFileNames.h&quot;
<br>#include &quot;itkNumericSeriesFileNames.h&quot;<br>#include &lt;vector&gt;<br>#include &lt;itksys/SystemTools.hxx&gt;<br><br>#include &quot;itkImageFileReader.h&quot;
<br>&nbsp;<br>#include &lt;FL/Fl.H&gt;
<br>#include &lt;FL/Fl_Window.H&gt;
<br>#include &lt;FL/fl_file_chooser.H&gt;
<br>#include &quot;GLColorSliceView.h&quot;
<br>#include &quot;GLSliceView.h&quot;
<br>#include &quot;SliceView.h&quot;
<br>&nbsp;<br>#include &quot;DicomSeriesColorViewerGUI.h&quot;
<br>&nbsp;<br>&nbsp;<br>Fl_Window *form;
<br>&nbsp;<br>int usage(void)
<br>&nbsp;&nbsp; {
<br>&nbsp;&nbsp; std::cout &lt;&lt; &quot;DicomSeriesColorViewer&quot; &lt;&lt; std::endl;
<br>&nbsp;&nbsp; std::cout &lt;&lt; std::endl;
<br>&nbsp;&nbsp; std::cout &lt;&lt; &quot;DicomSeriesColorViewer &lt;DirName&gt;&quot; &lt;&lt; std::endl;
<br>&nbsp;&nbsp; std::cout &lt;&lt; std::endl;
<br>&nbsp;<br>&nbsp;&nbsp; return 1;
<br>&nbsp;&nbsp; }
<br>&nbsp;<br>int main(int argc, char **argv)
<br>&nbsp; {
<br>&nbsp; char *fName;
<br>&nbsp;<br>&nbsp; if(argc &gt; 2)
<br>&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp; return usage();
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp; else
<br>&nbsp;&nbsp;&nbsp; if(argc == 1)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fName = fl_dir_chooser(&quot;Selecciona un directorio contenedor de la serie dicom&quot;, &quot;&quot;, 0);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(fName == NULL || strlen(fName)&lt;1)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp; else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(argv[1][0] != &#39;-&#39;)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fName = argv[argc-1];
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return usage();
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;<br>&nbsp; std::cout &lt;&lt; &quot;Cargando Serie Dicom: &quot; &lt;&lt; fName &lt;&lt; std::endl;<br>&nbsp; typedef itk::RGBPixel&lt; unsigned char&gt; RGBPixelType;<br>&nbsp; typedef itk::Image&lt; RGBPixelType, 3 &gt;&nbsp; ImageSerieTypeRGB;
<br>&nbsp; typedef itk::ImageSeriesReader&lt; ImageSerieTypeRGB &gt; ReaderSerieType;
<br>&nbsp; ReaderSerieType::Pointer readerSerie = ReaderSerieType::New();
<br>&nbsp; typedef itk::GDCMImageIO ImageIOType;<br>&nbsp; ImageIOType::Pointer gdcmImageIO = ImageIOType::New();<br>&nbsp; typedef itk::GDCMSeriesFileNames NamesGeneratorType;<br>&nbsp; NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();<br>
&nbsp; namesGenerator-&gt;SetInputDirectory(fName);<br>&nbsp; const ReaderSerieType::FileNamesContainer &amp; filenames = namesGenerator-&gt;GetInputFileNames();<br>&nbsp; readerSerie-&gt;SetImageIO( gdcmImageIO );
<br>&nbsp; readerSerie-&gt;SetFileNames(filenames);
<br>&nbsp;&nbsp;
<br>&nbsp;<br>&nbsp; &nbsp;&nbsp;&nbsp; try
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; readerSerie-&gt;Update();
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; catch (itk::ExceptionObject &amp; e)
<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;error&quot;;
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw e;
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
<br>&nbsp;<br>&nbsp; typedef itk::GDCMImageIO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageIOType;
<br>&nbsp; ImageIOType::Pointer dicomIO = ImageIOType::New();
<br>&nbsp; dicomIO-&gt;SetMaxSizeLoadEntry(0xffff);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
<br>&nbsp; readerSerie-&gt;SetImageIO( dicomIO );
<br>&nbsp; ImageSerieTypeRGB::Pointer imP;
<br>&nbsp; imP = readerSerie-&gt;GetOutput();
<br>&nbsp; try
<br>&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; readerSerie-&gt;Update();
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp; catch( ... )
<br>&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Problemas leyendo la serie&quot; &lt;&lt; std::endl;
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return 1;
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp; std::cout &lt;&lt; &quot;...Cargada la Serie Dicom&quot; &lt;&lt; std::endl;
<br>&nbsp;<br>&nbsp;<br>&nbsp; std::cout &lt;&lt; std::endl;
<br>&nbsp; std::cout &lt;&lt; &quot;Para instrucciones sobre cómo manejar la ventana,&quot; &lt;&lt; std::endl;
<br>&nbsp; std::cout &lt;&lt; &quot;&nbsp;&nbsp; teclea &#39;h&#39; dentro de la ventana&quot; &lt;&lt; std::endl;
<br>&nbsp;&nbsp;
<br>&nbsp; form = make_window();
<br>&nbsp;<br>&nbsp; tkMain-&gt;label(fName);
<br>&nbsp;&nbsp;
<br>&nbsp; tkWin-&gt;SetInputImage(imP);
<br>&nbsp;&nbsp;
<br>&nbsp; form-&gt;show();
<br>&nbsp; tkWin-&gt;show();
<br>&nbsp; tkWin-&gt;update();
<br>&nbsp;<br>&nbsp; Fl::run();
<br>&nbsp;&nbsp;
<br>&nbsp; return 1;
<br>&nbsp; }
<br clear="all"><br><br><br>It works right, but I need to know the name of the 2D slice image wich is visualized in each moment, I mean, the name of current slice in the viewer (not number, the name of the 2d image). This is for show a information about this image generated by me lately. How can I do this? Perharps I should add any code to FltkImageViewer in the following part to change the current image at the same time I press &#39;.&#39; or &#39;,&#39; keyboards to go next or previous slice.<br>
<br><br>case &#39;,&#39;:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //when pressing down &quot;&gt;&quot; or &quot;&lt;&quot; key, scrolling will go faster
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( fastMov &lt; fastMovThresh)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastMov ++;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pace = 1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pace = fastMovVal;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((int)cWinCenter[cWinOrder[2]]-pace&lt;0)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( (int)cWinCenter[cWinOrder[2]] == 0)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sliceNum(0);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sliceNum((int)cWinCenter[cWinOrder[2]]-pace);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;update();
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case &#39;&gt;&#39;:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case &#39;.&#39;:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //when pressing down &quot;&gt;&quot; or &quot;&lt;&quot; key, scrolling will go faster
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( fastMov &lt; fastMovThresh)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastMov ++;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pace = 1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pace = fastMovVal;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((int)cWinCenter[cWinOrder[2]]+pace&gt;(int)cDimSize[cWinOrder[2]]-1)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((int)cWinCenter[cWinOrder[2]] == (int)cDimSize[cWinOrder[2]]-1)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sliceNum((int)cDimSize[cWinOrder[2]]-1);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sliceNum(cWinCenter[cWinOrder[2]]+pace);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;update();
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br><br>Can anybody helps me?<br>-- <br>Esther.
</div>