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>
67 void load(Image<I>& ima,
68 const std::string& filename);
71 # ifndef MLN_INCLUDE_ONLY
75 image2d<V>
load(
const std::string& filename)
77 trace::entering(
"mln::io::gdcm::load");
79 trace::exiting(
"mln::io::gdcm::load");
85 image3d<V>
load(
const std::string& filename)
87 trace::entering(
"mln::io::gdcm::load");
89 trace::exiting(
"mln::io::gdcm::load");
97 const std::string& filename)
99 trace::entering(
"mln::io::dicom::load");
101 I& ima = exact(ima_);
104 r.SetFileName(filename.c_str());
107 std::cerr <<
"error: cannot open file '" << filename <<
"'!";
114 gdcm::Image& image = r.GetImage();
116 char* dataBuffer =
new char[image.GetBufferLength()];
117 image.GetBuffer(dataBuffer);
119 int ndims = image.GetNumberOfDimensions();
120 const unsigned int* dims = image.GetDimensions();
122 unsigned short bits_allocated = image.GetPixelFormat().GetBitsAllocated();
123 unsigned short bytes_allocated = bits_allocated / 8;
124 unsigned short bits_stored = image.GetPixelFormat().GetBitsStored();
125 unsigned short samples_per_pixel = image.GetPixelFormat().GetSamplesPerPixel();
127 unsigned int offset = 8 - (bits_allocated - bits_stored);
128 unsigned int off_pow = 1;
129 for (
unsigned int i = 0; i < offset; ++i)
134 if (mln_site_(I)::dim != ndims)
136 std::cerr <<
"error: dimension mismatch" << std::endl;
140 algebra::vec<mln_site_(I)::dim, unsigned int> vmin;
141 algebra::vec<mln_site_(I)::dim, unsigned int> vmax;
142 algebra::vec<mln_site_(I)::dim, unsigned int> vdims;
144 for (
int i = 0; i < ndims; ++i, --j)
147 vmax[i] = dims[i] - 1;
151 vdims[j] = dims[i - 1] * vdims[j + 1];
156 std::swap(vmin[0], vmin[1]);
157 std::swap(vmax[0], vmax[1]);
160 mln_site(I) pmin(vmin);
161 mln_site(I) pmax(vmax);
162 mln_concrete(I) result(
box<mln_site(I)>(pmin, pmax));
164 mln_piter(I) p(ima.domain());
165 unsigned int index = 0;
170 for (
int i = 0; i < ndims; ++i)
172 index += p[i] * vdims[i];
175 mln_value(I) v = (
unsigned char) dataBuffer[(index * bytes_allocated) * samples_per_pixel];
177 for (
unsigned int j = 0; j < bytes_allocated; ++j)
179 v += ((
unsigned char) dataBuffer[(index * bytes_allocated + j) * samples_per_pixel]) * 256 * j;
187 trace::exiting(
"mln::io::dicom::load");
190 # endif // ! MLN_INCLUDE_ONLY
199 #endif // ! MLN_IO_DICOM_LOAD_HH