27 #ifndef MLN_IO_DICOM_LOAD_HH
28 # define MLN_IO_DICOM_LOAD_HH
33 # include <mln/core/image/image2d.hh>
34 # include <mln/core/image/image3d.hh>
36 # include <mln/algebra/vec.hh>
38 # include <gdcm-2.0/gdcmReader.h>
39 # include <gdcm-2.0/gdcmImageReader.h>
40 # include <gdcm-2.0/gdcmWriter.h>
41 # include <gdcm-2.0/gdcmDataSet.h>
42 # include <gdcm-2.0/gdcmAttribute.h>
68 void load(Image<I>& ima,
72 # ifndef MLN_INCLUDE_ONLY
78 mln_trace(
"mln::io::gdcm::load");
87 mln_trace(
"mln::io::gdcm::load");
95 void load(Image<I>& ima_,
98 mln_trace(
"mln::io::dicom::load");
100 I& ima =
exact(ima_);
103 r.SetFileName(filename.c_str());
106 std::cerr <<
"error: cannot open file '" << filename <<
"'!";
113 gdcm::Image&
image = r.GetImage();
115 char* dataBuffer =
new char[image.GetBufferLength()];
116 image.GetBuffer(dataBuffer);
118 int ndims = image.GetNumberOfDimensions();
119 const unsigned int* dims = image.GetDimensions();
121 unsigned short bits_allocated = image.GetPixelFormat().GetBitsAllocated();
122 unsigned short bytes_allocated = bits_allocated / 8;
123 unsigned short bits_stored = image.GetPixelFormat().GetBitsStored();
124 unsigned short samples_per_pixel = image.GetPixelFormat().GetSamplesPerPixel();
126 unsigned int offset = 8 - (bits_allocated - bits_stored);
127 unsigned int off_pow = 1;
128 for (
unsigned int i = 0; i < offset; ++i)
133 if (mln_site_(I)::dim != ndims)
135 std::cerr <<
"error: dimension mismatch" << std::endl;
139 algebra::vec<mln_site_(I)::dim, unsigned int> vmin;
140 algebra::vec<mln_site_(I)::dim, unsigned int> vmax;
141 algebra::vec<mln_site_(I)::dim, unsigned int> vdims;
143 for (
int i = 0; i < ndims; ++i, --j)
146 vmax[i] = dims[i] - 1;
150 vdims[j] = dims[i - 1] * vdims[j + 1];
155 std::swap(vmin[0], vmin[1]);
156 std::swap(vmax[0], vmax[1]);
159 mln_site(I) pmin(vmin);
160 mln_site(I) pmax(vmax);
161 mln_concrete(I) result(
box<mln_site(I)>(pmin, pmax));
163 mln_piter(I)
p(ima.domain());
164 unsigned int index = 0;
169 for (
int i = 0; i < ndims; ++i)
171 index += p[i] * vdims[i];
174 mln_value(I) v = (
unsigned char) dataBuffer[(index * bytes_allocated) * samples_per_pixel];
176 for (
unsigned int j = 0; j < bytes_allocated; ++j)
178 v += ((
unsigned char) dataBuffer[(index * bytes_allocated + j) * samples_per_pixel]) * 256 * j;
188 # endif // ! MLN_INCLUDE_ONLY
197 #endif // ! MLN_IO_DICOM_LOAD_HH