$extrastylesheet
Olena  User documentation 2.1
An Image Processing Platform
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
ppm16.cc
1 // Copyright (C) 2007, 2008, 2009, 2010 EPITA Research and Development
2 // Laboratory (LRDE)
3 //
4 // This file is part of Olena.
5 //
6 // Olena is free software: you can redistribute it and/or modify it under
7 // the terms of the GNU General Public License as published by the Free
8 // Software Foundation, version 2 of the License.
9 //
10 // Olena is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Olena. If not, see <http://www.gnu.org/licenses/>.
17 //
18 // As a special exception, you may use this file as part of a free
19 // software project without restriction. Specifically, if other files
20 // instantiate templates or use macros or inline functions from this
21 // file, or you compile this file and link it with other files to produce
22 // an executable, this file does not by itself cause the resulting
23 // executable to be covered by the GNU General Public License. This
24 // exception does not however invalidate any other reasons why the
25 // executable file might be covered by the GNU General Public License.
26 
27 #include <mln/core/image/image2d.hh>
28 #include <mln/win/rectangle2d.hh>
29 
30 #include <mln/value/rgb8.hh>
31 #include <mln/value/rgb16.hh>
32 
33 #include <mln/io/ppm/load.hh>
34 #include <mln/io/ppm/save.hh>
35 
36 #include <mln/data/compare.hh>
37 
38 #include "tests/data.hh"
39 
40 
41 using namespace mln;
42 
43 struct to16bits : mln::Function_v2v<to16bits>
44 {
45 
46  typedef value::rgb16 result;
47  result operator()(value::rgb8 v) const
48  {
49  result ret(v.red().to_enc() * 256,
50  v.green().to_enc() * 256,
51  v.blue().to_enc() * 256);
52  return ret;
53  }
54 };
55 
56 struct to8bits : mln::Function_v2v<to8bits>
57 {
58 
59  typedef value::rgb8 result;
60  result operator()(value::rgb16 v) const
61  {
62  result ret(v.red().to_enc() / 256,
63  v.green().to_enc() / 256,
64  v.blue().to_enc() / 256);
65  return ret;
66  }
67 };
68 
69 int main()
70 {
71  using namespace mln;
72  using value::rgb8;
73  using value::rgb16;
74 
75  typedef image2d<rgb8> I;
76 
77  {
78  // load a 8-bit image A
79  image2d<rgb8> a = io::ppm::load<rgb8>(MLN_IMG_DIR "/lena.ppm");
80  image2d<rgb16> b(a.domain());
81 
82  image2d<rgb8>::fwd_piter p(b.domain());
83 
84  // save it as a 16-bit ppm image B
85  to16bits f;
86  for_all(p)
87  b(p) = f(a(p));
88  io::ppm::save(b, "ppm16-out16.ppm");
89 
90  // reload B into C
91  image2d<rgb16> c = io::ppm::load<rgb16>("ppm16-out16.ppm");
92  image2d<rgb8> d(a.domain());
93 
94 
95  // save C as a 8-bit ppm image D
96  to8bits g;
97  for_all(p)
98  d(p) = g(c(p));
99  io::ppm::save(d, "ppm16-out8.ppm");
100 
101  // D shall equal A
102  mln_assertion(d == a);
103  }
104 
105  {
106  // Abort
107 // image2d<rgb8> a;
108 // io::ppm::load(a, MLN_IMG_DIR "/lena_16.ppm");
109 
111  io::ppm::load(b, MLN_IMG_DIR "/lena_16.ppm");
112 
113  }
114 
115  {
116  // Abort
117 // image2d< value::rgb<8> > a =
118 // io::ppm::load(MLN_IMG_DIR "/lena_16.ppm");
119 
120  // Abort
121 // image2d< value::rgb<16> > a =
122 // io::ppm::load< value::rgb<16> >(MLN_IMG_DIR "/lena.ppm");
123 
125  io::ppm::load< value::rgb<16> >(MLN_IMG_DIR "/lena_16.ppm");
126 
128  io::ppm::load< value::rgb<8> >(MLN_IMG_DIR "/lena.ppm");
129  }
130 }